如何在即时函数中使用“this”

How to use "this" inside an immediate function

本文关键字:this 函数      更新时间:2023-09-26

我正在尝试将我的代码封装在一个即时函数中,稍后将通过全局变量 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不会引用全局window,而是undefined

不能使用"this"来指代函数本身。"this"指向对象内部对象的实例。

自执行函数(即时函数)仅在运行时提供执行上下文。 x 将始终是未定义的,因为在您的代码中,它被分配了即时函数的结果,并且由于它返回的任何内容,因此 x 是未定义的。

这不应该是未定义的,在匿名函数中它会引用 DOMWindow 对象,您看到的未定义只是匿名函数的结果。

如果你想要一个"模块"或类这样的行为,那么只需

var x = function() {
console.log(x, this);
};

会像使 X 成为构造函数一样,然后您可以使用 prototype 属性使用要继承的属性扩展对象。

x.prototype.foo = function() {
}

this是函数所有者。 而不是函数本身。

顺便说一下,您报告的输出是不连贯的:

console.log(this); // DOMWindow

演示

这是因为immediate function的所有者是全局对象 - window

如前所述,this并不总是DOMWindow对象,但它仍然不能undefined

你不应该在直接的 anon func 中使用this,这是没有意义的。 this建议稍后使用创建的对象,即时函数具有相反的目的 - 在执行后立即销毁其名称。在您的示例中,this应引用全局对象,窗口。