Javascript 如何使用;这";直接函数内部
我试图将我的代码封装在一个立即函数中,稍后将通过全局变量x访问该函数,并像一个“模块”一样运行 代码:Javascript 如何使用;这";直接函数内部,javascript,unobtrusive-javascript,Javascript,Unobtrusive Javascript,我试图将我的代码封装在一个立即函数中,稍后将通过全局变量x访问该函数,并像一个“模块”一样运行 代码: var x = (function () { console.log(x); // undefined console.log(this); // undefined })(); 但是我不明白为什么我不能用这个来表示函数本身 编辑: var x = (function () { console.log(x); // undefined console.l
var x = (function () {
console.log(x); // undefined
console.log(this); // undefined
})();
但是我不明白为什么我不能用这个
来表示函数本身
编辑:
var x = (function () {
console.log(x); // undefined
console.log(this); // undefined
})();
立即函数位于严格模式下的另一个函数中(
“使用严格”
)不能使用“this”来指函数本身。“this”指向对象内部的对象实例。这是函数所有者。而不是函数本身
顺便说一下,您报告的输出是不正确的:
console.log(this); // DOMWindow
这是因为立即函数
的所有者是全局对象-窗口
正如注释所述,这个
并不总是必须是DOMWindow
对象,但它永远不能是未定义的
自执行函数(即时函数)仅在运行时提供执行上下文。x总是未定义的,因为在您的代码中,它被分配了立即函数的结果,并且当它返回任何东西时,x是未定义的
这不应该是未定义的,因为在匿名函数中,它将引用DOMWindow对象,您看到的未定义对象只是匿名函数的结果
如果你想要一个“模块”或类的行为,那么
var x = function() {
console.log(x, this);
};
就像它使x成为一个构造函数一样,您可以使用prototype属性用您想要继承的属性扩展对象
x.prototype.foo = function() {
}
你不应该在immediate anon func中使用这个
,它没有意义这
建议以后使用已创建的对象,而立即函数有相反的目的——在执行后立即销毁它的namespase。
在您的示例中,这个
应该指的是全局对象,窗口。当一个函数在一个函数中执行,或者作为一个回调传递给另一个在中处理的函数时,会发生一件有趣的事
,并观看控制台
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();
因此,如果该代码在严格模式下的另一个函数中作为回调执行,此
将不会引用全局窗口
,而是未定义
@Joseph。这是正确的,但在所有情况下它都不是未定义的!谢谢,你知道这种奇怪行为的原因是什么吗?我提供的文章的第二部分解释了这一点。a还说明了原因,主要是函数中的代码无法访问全局对象。