javascript – Eine Frage dazu in Js
为情所困
为情所困 2017-07-05 10:37:50
0
5
966
var length = 10;

function cl() {
    console.log(this.length);
}

var o = {
    length: 20,
    show: function (fn) {
        fn();
        arguments[0]();
    }
}

o.show(cl); // 10 

Zu dieser Frage möchte ich wissen, ob dies in js nicht auf denjenigen verweist, der es aufruft? Warum zeigt dies in cl immer noch auf das Fenster statt auf das Objekt, wenn es zum ersten Mal aufgerufen wird? Ich weiß, dass es nutzlos ist. Es ist wahrscheinlich falsch, aber warum ist es falsch? callWarum weist der zweite Punkt auf Argumente hin?

Warum ist gleichzeitig die erste Ausgabe dieses Codes bei der Ausführung in NodeJS undiffed?

为情所困
为情所困

Antworte allen(5)
巴扎黑
  1. 直接使用函数名字调用,无论你外面包了多少层,调用者就是window

  2. 因为那个方括号运算符,方括号运算符作为对象取值运算,在某种意义上是可以等于点.运算符的,所以这里在形式上其实可以类比成arguments.0(),你看,这不就是arguments来调用了这个函数了嘛,所以运行的时候this就指向它了。

学霸

this的指向不是在声明的时候确定的而是在调用的时候被定义的有这么几种情况

  1. 普通函数调用,this为全局对象或是undefined

  2. 作为对象的方法,this为那个对象

  3. new 表达式,this为以该函数为原型的新创建的对象

  4. 使用 apply/call指定 this

  5. 用bind绑定固定的this

  6. 事件处理函数中的this是当前的触发事件的DOM元素(event.currentTarget)

不知道对你有没有帮助

扔个三星炸死你

就这道题而言。

  1. o.show()执行,那么show函数作用域里面用到的this都指向 o.
    但其实这里是在里面调用fn(), fn并不是o去调用的,没有o.fn... 一个比较low的原则就是函数调用点前面是谁,函数里面的this就是谁。 这里肯定是默认的window了。

  2. arguments[0] ==> arguments.0
    数组也是对象,[]调用跟 . 同理,所以this就是arguments

  3. 关于node中,由于是模块化,this指向的是global,而且var 声明的时候不会像浏览器中,有window调用。node中是没有这个机制的。

巴扎黑
o.show(cl) ==>相当于 
o.show(function(){
console.log(this)  //windows
});
我想大声告诉你

o.show()this指向o,但和本题无关。
o.show()中的fn标识符解析得到一个引用类型(内部类型),其base属性(本题中值为show()方法的活动对象)即是this的指向。因为活动对象返回null,所以this指向null,从而指向了window
arguments[0]()arguments[0]同样返回一个引用类型,其base属性的值为arguments,所以this指向arguments

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage