如何使用"这个"在一个即时功能内

时间:2012-04-12 09:15:13

标签: javascript unobtrusive-javascript

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

var x = (function () {

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

})();

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

修改

立即函数位于严格模式"use strict"

中的另一个函数内

5 个答案:

答案 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

DEMO

那是因为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应引用全局对象,窗口。