如果您有以下代码:
var global = this;
function A () {
function B () {
return this;
}
return B();
}
var C = new A();
C === global // true
为什么函数B中的this
引用全局空间而不是对象A的this
?
答案 0 :(得分:3)
this
的值是在每次函数调用时确定的。因为B
在没有任何上下文的情况下被调用,所以this
的值是全局对象。
只需复制它就可以在外部环境中保留this
:
function A() {
var x = this;
function B() {
return x;
}
return B();
}
答案 1 :(得分:2)
this
与范围无关,它不是变量。它是一个关键字,用于评估当前正在执行的函数的对象上下文。函数的对象上下文由您调用它的方式决定。无论在何处或如何定义函数都无关紧要。
当您调用类似fn()
的函数时,它不在对象上下文中,并且语言错误地尝试解决它,因为它应该只是在this
时出现错误。这在严格模式下有所修正,它将评估为undefined
。
当您将某个函数作为某个对象的属性调用时。 obj.fn()
然后obj
绑定到this
进行该通话。
因为为了获得调用的正确对象上下文而必须将函数附加到某个对象会很笨拙,所有函数都继承了一个允许您明确指定对象上下文的.call
方法:
return B.call(this);
答案 2 :(得分:0)
伴随Pointy的正确答案:
这样做的原因是因为你可以用功能做任何你想做的事情。 您可以从函数A返回函数B,并将其另存为全局变量。
或者您可以将函数B作为方法附加到Object或十几个对象。 或者您可以在AJAX回调中使用它,或将其用作计时器的回调。
因为引擎不知道函数B会发生什么,所以语言说this
指的是调用函数时所调用的函数。
这为语言增添了很多活力,但如果你不确定“this”在任何特定的时间指向什么,它也会增加很多麻烦。
经验法则:
如果函数 直接 作为对象的方法附加,或者正在使用.call
或.apply
调用函数提供上下文,如myFunc.call(myObj)
,然后this
引用window
。