我试图将我的代码封装在一个即时函数中,稍后将通过全局变量 x 访问该函数,并像一个“模块”一样工作。
代码:
var x = (function () {
console.log(x); // undefined
console.log(this); // undefined
})();
但我不明白为什么我不能this
用来指代函数本身。
编辑:
立即函数在严格模式下的另一个函数内( "use strict"
)
我试图将我的代码封装在一个即时函数中,稍后将通过全局变量 x 访问该函数,并像一个“模块”一样工作。
代码:
var x = (function () {
console.log(x); // undefined
console.log(this); // undefined
})();
但我不明白为什么我不能this
用来指代函数本身。
编辑:
立即函数在严格模式下的另一个函数内( "use strict"
)
当一个函数在一个函数中执行,或者作为回调传递给另一个在严格模式下处理的函数时,会发生一件有趣的事情
这是一个演示,并观看控制台
function foo(){
'use strict';
(function(){
//undefined in strict mode
console.log('in foo, this is: '+this);
}());
}
function bar(){
(function(){
//DOMWindow when NOT in strict mode
console.log('in bar, this is: '+this);
}());
}
foo();
bar();
因此,如果该代码在另一个处于严格模式的函数中作为回调执行,this
则不会引用 global window
,而是undefined
.
您不能使用“this”来引用函数本身。“this”指向对象内部的对象实例。
this
是函数所有者。而不是函数本身。
顺便说一句,您报告的输出不正确:
console.log(this); // DOMWindow
那是因为 的所有者immediate function
是 Global-Object - window
。
正如评论的那样,this
并不总是必须是DOMWindow
对象,但它仍然永远不可能undefined
!
自执行函数(立即函数)仅在运行时提供执行上下文。x 将始终未定义,因为在您的代码中,它被分配了立即函数的结果,并且因为它没有返回任何 x 未定义。
这不应该是未定义的,在匿名函数中它将引用 DOMWindow 对象,您看到的未定义只是匿名函数的结果。
如果您想要“模块”或类似行为的类,那么只需
var x = function() {
console.log(x, this);
};
会像创建 xa 构造函数那样做,然后您可以使用要使用原型属性继承的属性来扩展对象。
x.prototype.foo = function() {
}
你不应该this
在立即匿名函数中使用,它没有意义。this
建议稍后使用创建的对象,并且立即函数具有相反的目的 - 在执行后立即销毁它的命名空间。在您的示例this
中,应指全局对象 window。