为什么这个立即调用的方法返回窗口对象?

时间:2014-04-14 01:22:45

标签: javascript iife

为什么立即调用的方法会将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 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

这是全局上下文,这就是你看到窗口对象的原因。为了让它显示您的o对象,您需要bind它到o对象。 this指当前上下文中的对象。当this对象不在任何其他上下文中时,window的值始终保存。

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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