我正在尝试将我的代码封装在一个立即函数中,稍后将通过全局变量x访问该函数,并像“模块”一样运行。
码
var x = (function () {
console.log(x); // undefined
console.log(this); // undefined
})();
但我不明白为什么我不能使用this
来引用函数本身。
修改
立即函数位于严格模式("use strict"
)
答案 0 :(得分:1)
当函数在函数内执行时会发生一个有趣的事情,或者作为回调传递给strict mode中处理的另一个函数
here's a demo,并观看控制台
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
将不会引用全局window
,而是undefined
。< / p>
答案 1 :(得分:0)
您不能使用“this”来引用该功能本身。 “this”指向对象内部对象的实例。
答案 2 :(得分:0)
this
是函数所有者。不是功能本身。
顺便说一下,你报告的输出是incorect:
console.log(this); // DOMWindow
那是因为immediate function
的所有者是全球对象 - window
。
如评论所述,this
并非始终必须是DOMWindow
对象,但它永远不会是undefined
!
答案 3 :(得分:0)
自执行功能(立即功能)仅在运行时提供执行上下文。 x将始终未定义,因为在您的代码中,它被赋予立即函数的结果,并且当它返回时,x未定义。
这不应该是未定义的,在一个匿名函数中它会引用DOMWindow对象,你看到的undefined只是匿名函数的结果。
如果您想要“模块”或类似行为,那么只需
var x = function() {
console.log(x, this);
};
会这样做,因为它会使x成为构造函数,然后您可以使用prototype属性扩展具有要继承的属性的对象。
x.prototype.foo = function() {
}
答案 4 :(得分:0)
你不应该在即时功能中使用this
,这是没有意义的。 this
建议以后使用创建的对象,而立即函数具有相反的目的 - 在执行后立即销毁它的名称空间。
在您的示例中,this
应引用全局对象,窗口。