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? call
Warum weist der zweite Punkt auf Argumente hin?
直接使用函数名字调用,无论你外面包了多少层,调用者就是
window
。因为那个方括号运算符,方括号运算符作为对象取值运算,在某种意义上是可以等于点
.
运算符的,所以这里在形式上其实可以类比成arguments.0()
,你看,这不就是arguments
来调用了这个函数了嘛,所以运行的时候this
就指向它了。this的指向不是在声明的时候确定的而是在调用的时候被定义的有这么几种情况
普通函数调用,this为全局对象或是undefined
作为对象的方法,this为那个对象
new 表达式,this为以该函数为原型的新创建的对象
使用 apply/call指定 this
用bind绑定固定的this
事件处理函数中的this是当前的触发事件的DOM元素(event.currentTarget)
不知道对你有没有帮助
就这道题而言。
o.show()执行,那么show函数作用域里面用到的this都指向 o.
但其实这里是在里面调用fn(), fn并不是o去调用的,没有o.fn... 一个比较low的原则就是函数调用点前面是谁,函数里面的this就是谁。 这里肯定是默认的window了。
arguments[0] ==> arguments.0
数组也是对象,[]调用跟 . 同理,所以this就是arguments
关于node中,由于是模块化,this指向的是global,而且var 声明的时候不会像浏览器中,有window调用。node中是没有这个机制的。
o.show()
的this
指向o
,但和本题无关。o.show()
中的fn
标识符解析得到一个引用类型(内部类型),其base
属性(本题中值为show()
方法的活动对象)即是this
的指向。因为活动对象返回null
,所以this
指向null
,从而指向了window
。arguments[0]()
的arguments[0]
同样返回一个引用类型,其base
属性的值为arguments
,所以this
指向arguments
。