Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用;这";直接函数内部_Javascript_Unobtrusive Javascript - Fatal编程技术网

Javascript 如何使用;这";直接函数内部

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

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

代码:

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还说明了原因,主要是函数中的代码无法访问全局对象。