4

我试图将我的代码封装在一个即时函数中,稍后将通过全局变量 x 访问该函数,并像一个“模块”一样工作。

代码:

var x = (function () {

    console.log(x); // undefined
    console.log(this); // undefined

})();

但我不明白为什么我不能this用来指代函数本身。

编辑:

立即函数在严格模式下的另一个函数内( "use strict")

4

5 回答 5

1

当一个函数在一个函数中执行,或者作为回调传递给另一个在严格模式下处理的函数时,会发生一件有趣的事情

这是一个演示,并观看控制台

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.

于 2012-04-12T09:29:50.850 回答
0

您不能使用“this”来引用函数本身。“this”指向对象内部的对象实例。

于 2012-04-12T09:17:32.507 回答
0

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

顺便说一句,您报告的输出不正确:

console.log(this); // DOMWindow

演示

那是因为 的所有者immediate function是 Global-Object - window

正如评论的那样,this并不总是必须是DOMWindow对象,但它仍然永远不可能undefined

于 2012-04-12T09:17:33.707 回答
0

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

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

如果您想要“模块”或类似行为的类,那么只需

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

会像创建 xa 构造函数那样做,然后您可以使用要使用原型属性继承的属性来扩展对象。

x.prototype.foo = function() {

}
于 2012-04-12T09:20:28.403 回答
0

你不应该this在立即匿名函数中使用,它没有意义。this建议稍后使用创建的对象,并且立即函数具有相反的目的 - 在执行后立即销毁它的命名空间。在您的示例this中,应指全局对象 window。

于 2012-04-12T09:29:31.877 回答