为什么立即调用的方法会将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}
答案 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); //
答案 2 :(得分:1)
执行立即调用的函数表达式(IIFE)时:
... = (function () {
console.log(this);
}());
this 的值不是由调用设置的,因此在进入函数时它是未定义的,因此设置为全局对象。在严格模式下,它将保持未定义。
答案 3 :(得分:0)
如果在对象定义主体中执行console.log(this)
,默认情况下它将引用Window对象,因为您的对象在浏览器中不存在。
所以你必须在你的对象定义后执行函数,这是我的 DEMO
http://jsfiddle.net/X6cyr/2/