为什么对象上的函数是从自执行函数执行的?

时间:2013-08-22 19:47:39

标签: javascript

我有一个应用程序,在调试模式下写入许多单独的javascript文件,但作为页面头块的一部分同步加载。在发布中,我将所有这些文件合并在一起并将它们缩小。今天我一直在缩小版本中找到错误,所以我加载了一个合并文件来调试问题,发现一个库是自动执行一个函数,它导致window上定义的其他函数被执行。

我已经使用通用对象回复了此处的行为,无论窗口与否都无关紧要:

<head>
    <script>
        var a = {}

        a.X = function x(){
            console.log("shouldn't be executed");
        }

        (function(a){
            console.log("self execution");
        }(a));
     </script>
</head>

在这个例子中,我得到了

的输出
self execution 
shouldn't be executed 

如果我将通话更改为

<head>
    <script>
        var a = {}

        function x(){
            console.log("shouldn't be executed");
        }

        a.X = x;

        (function(a){
            console.log("self execution");
        }(a));
     </script>
</head>

然后我得到了

self execution

这是我的预期。在第一个例子中,当X传递给自执行函数时,为什么会调用a

3 个答案:

答案 0 :(得分:22)

将功能分配给;后,您错过了a.X

分号插入是触发。

匿名函数周围的()用于调用上一个函数,其返回值分配给X

即。你所拥有的相当于:

var a = {};

a.X = (function x(){
    console.log("shouldn't be executed");
}(
    (function(a){
        console.log("self execution");
    }(a))
));

顺便说一句,这个问题对于JS Lint来说是一个很好的广告,可以选择它。

答案 1 :(得分:3)

它与分号注入有关,因为当我使用分号时,它按预期工作:

    var a = {}

    a.X = function x(){
        console.log("shouldn't be executed");
    }; // added semicolon

    (function(a){
        console.log("self execution");
    }(a));

答案 2 :(得分:1)

您在;

之后错过了分号a.X = function x() { ...} ;

<强>即

a.X = function x(){
   console.log("shouldn't be executed");
};