如果您有以下代码:
var global = this;
function A () {
function B () {
return this;
}
return B();
}
var C = new A();
C === global // true
为什么this
in 函数 B 指的是全局空间而不是this
对象 A 的空间?
如果您有以下代码:
var global = this;
function A () {
function B () {
return this;
}
return B();
}
var C = new A();
C === global // true
为什么this
in 函数 B 指的是全局空间而不是this
对象 A 的空间?
的值this
取决于每个函数调用。因为B
是在没有任何上下文的情况下调用的,所以 的值this
是全局对象。
可以通过简单地复制它来保存this
在外部上下文中:
function A() {
var x = this;
function B() {
return x;
}
return B();
}
this
与范围无关,它不是变量。它是一个评估当前执行函数的对象上下文的关键字。函数的对象上下文取决于你如何调用它。函数的定义位置或方式无关紧要。
当您调用这样的函数时,fn()
它不在对象上下文中,并且语言错误地尝试解决它,而它应该只是在看到this
. 这在严格模式下有些固定,它会评估为undefined
.
当您将函数作为某个对象的属性调用时,IEobj.fn()
将obj
绑定到this
该调用。
由于必须将函数附加到某个对象以获取调用的正确对象上下文会很笨重,因此所有函数都继承一个.call
允许您显式指定对象上下文的方法:
return B.call(this);
伴随Pointy的正确答案:
这样做的原因是因为你可以用函数做任何你想做的事情。您可以从函数 A 返回函数 B,并将其保存为全局变量。
或者,您可以将函数 B 作为方法附加到一个对象或十几个对象。或者您可以在 AJAX 回调中使用它,或者将其用作来自计时器的回调。
因为引擎不知道函数 B 会发生什么,所以语言说它this
指的是函数被调用的任何时间,在它被调用的时候。
这为语言增加了很多活力,但也增加了很多麻烦,如果您不确定“this”在任何给定时间指向什么。
经验法则:
如果函数作为对象的方法直接附加,或者函数被使用.call
or调用.apply
并被提供上下文,例如myFunc.call(myObj)
,则this
指window
.