1

为什么立即调用的方法将window对象返回为this

var o = {};  
o.foo = function () {  
    console.log(this);  
}(); //Window {…}

但是当稍后执行时,该方法返回对象o(正如我在两种情况下所期望的那样)?

var o = {};
o.foo = function () {
    console.log(this);
}
o.foo(); //Object {foo: function}
4

4 回答 4

5

“this”是在调用时定义的。变量赋值是从右到左进行的,因此在进行任何赋值之前调用该函数,因此“this”仍然指的是全局窗口对象。

于 2014-04-14T01:27:28.673 回答
1
var o = {};  
o.foo = function () {  
    console.log(this);  
}(); //

这是全局上下文,这就是您看到窗口对象的原因。要让它显示您的o对象,您需要将其绑定o对象。this指当前上下文中的对象。当对象不在任何其他上下文中时,它的值this始终持有该对象。window

o.foo = function () {  
    console.log(this);  
}.bind(o); //

演示:http: //jsfiddle.net/X6cyr/1/

于 2014-04-14T01:24:49.873 回答
1

当您执行立即调用的函数表达式 (IIFE) 时:

... = (function () {  
         console.log(this);
      }());

this的值不是由调用设置的,因此在进入函数时它是未定义的,因此设置为全局对象。在严格模式下,它将保持未定义。

于 2014-04-14T01:35:02.120 回答
0

如果你console.log(this)在对象定义体中执行,默认它会引用 Window 对象,因为你的对象在浏览器中不存在。所以你必须在定义对象后执行函数,这是我的DEMO http://jsfiddle.net/X6cyr/2/

于 2014-04-14T01:37:12.377 回答