2012-08-05 54 views
2

如果你有下面的代码:范围的这种

var global = this; 
function A() { 
    function B() { 
     return this; 
    } 
    return B(); 
} 
var C = new A(); 
C === global // true 

为什么在函数B的this指的是全球空间而不是对象A的this

+0

除了@ Pointy的回答,你可以看到这个[技术在这里的实践](http://stackoverflow.com/questions/11814953/what-is-the-difference-in-the-invocation-of-this-in-这些-例子)。 (第二个代码片段) – phant0m 2012-08-05 13:36:08

回答

3

每个函数调用都会确定this的值。因为B在没有任何上下文的情况下被调用,所以this的值是全局对象。

它可以通过简单地复制它保留this在外部方面:

function A() { 
    var x = this; 
    function B() { 
    return x; 
    } 
    return B(); 
} 
0

陪尖尖的正确答案:

这样做的原因是因为你可以做任何你想要的功能。 您可以从函数A返回函数B,并将其保存为全局变量。

或者您可以将函数B作为方法附加到一个对象或十几个对象。 或者您可以在AJAX回调中使用它,或者将它用作定时器的回调。

因为引擎不知道函数B会发生什么,所以该语言表示this指的是在调用函数时调用的任何函数。

这给语言增加了很多活力,但如果您不确定在任何给定时间指向的是什么,它也会增加很多头痛。

规则拇指:

如果函数是直接连接作为一个对象的方法,或一个函数被调用时.call.apply并且被进给的情况下,像myFunc.call(myObj),然后this指的是window

+0

感谢所有答复。我非常感谢你的时间。我现在知道了。 – 2012-08-06 18:36:23

2

this与范围无关,它不是一个变量。这是一个关键字,用于评估当前正在执行的函数的对象上下文。函数的对象上下文由您如何调用它决定。功能定义的位置或方式无关紧要。

当您调用像fn()这样的函数时,它不在对象上下文中,并且该语言错误地尝试解决该问题,因为它应该只是在仅看到this时抛出一个错误。在严格模式下,它会在某种程度上修正为undefined

当您将函数作为某个对象I.E.的属性调用时obj.fn()然后obj针对该呼叫绑定到this

因为它是笨重具有的功能附加到某个对象只是为了获得呼叫对象的权利方面,所有功能继承.call方法,使您可以显式指定对象上下文:

return B.call(this);