JS:如果你调用这个函数,结果是 3,但是如果你用 f.call(f) 绑定上下文 - 结果是 5
JS: If you call the function, the result is 3, but if you bind the context with f.call(f) - the result is 5
var f = function() {
this.x = 5;
(function() {
this.x = 3;
})();
console.log(this.x);
};
var obj = {
x: 4,
m: function() {
console.log(this.x);
}
};
f(); // 3
new f(); // 5
f.call(f); // 5
obj.m.call(f); // 5
如果调用该函数,结果为 3,但如果将上下文与 f.call(f) 绑定 - 结果为 5。此外,如果我将函数作为构造函数调用。为什么会这样?很抱歉这个愚蠢的问题,但我试图找到答案,但找不到。
在第一种情况下,您调用 f()
作为一个简单的命名函数。所以它里面的this
关键字指的是全局作用域(window)。
结果:函数体内的this
和函数体内闭包内的this
指向同一个对象:window.
在第二种情况下,您将 f() 作为构造函数调用,因此 this
关键字将指向创建的对象。但是闭包,因为它是匿名的,将继续引用 this
的全局范围,所以在这种情况下,它们不会指向同一事物,并且构造函数 f()
创建的对象不会发生变化通过关闭。
在第三种情况下,您像第一次一样调用 f
,但将 this
的值指定为函数 f
本身。所以这里this
的行为相当于第二种情况
在第 4 种情况下,您使用 f
的上下文调用 m
,因此 this.x
将引用 f
for this
,f
里面的闭包一直引用 window.
var f = function() {
this.x = 5;
(function() {
this.x = 3;
})();
console.log(this.x);
};
var obj = {
x: 4,
m: function() {
console.log(this.x);
}
};
f(); // 3
new f(); // 5
f.call(f); // 5
obj.m.call(f); // 5
如果调用该函数,结果为 3,但如果将上下文与 f.call(f) 绑定 - 结果为 5。此外,如果我将函数作为构造函数调用。为什么会这样?很抱歉这个愚蠢的问题,但我试图找到答案,但找不到。
在第一种情况下,您调用
f()
作为一个简单的命名函数。所以它里面的this
关键字指的是全局作用域(window)。结果:函数体内的
this
和函数体内闭包内的this
指向同一个对象:window.在第二种情况下,您将 f() 作为构造函数调用,因此
this
关键字将指向创建的对象。但是闭包,因为它是匿名的,将继续引用this
的全局范围,所以在这种情况下,它们不会指向同一事物,并且构造函数f()
创建的对象不会发生变化通过关闭。在第三种情况下,您像第一次一样调用
f
,但将this
的值指定为函数f
本身。所以这里this
的行为相当于第二种情况在第 4 种情况下,您使用
f
的上下文调用m
,因此this.x
将引用f
forthis
,f
里面的闭包一直引用 window.