为什么立即调用的方法将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}
为什么立即调用的方法将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
指当前上下文中的对象。当对象不在任何其他上下文中时,它的值this
始终持有该对象。window
o.foo = function () {
console.log(this);
}.bind(o); //
演示:http: //jsfiddle.net/X6cyr/1/
当您执行立即调用的函数表达式 (IIFE) 时:
... = (function () {
console.log(this);
}());
this的值不是由调用设置的,因此在进入函数时它是未定义的,因此设置为全局对象。在严格模式下,它将保持未定义。
如果你console.log(this)
在对象定义体中执行,默认它会引用 Window 对象,因为你的对象在浏览器中不存在。所以你必须在定义对象后执行函数,这是我的DEMO
http://jsfiddle.net/X6cyr/2/