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

Why does this immediately invoked method return the window object?

本文关键字:方法 返回 窗口 对象 调用 为什么      更新时间:2023-09-26

为什么立即调用的方法将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}
">

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

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

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

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

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

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

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

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

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