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

dev*_*rts 13 javascript

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

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

<head>
    <script>
        var a = {}

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

        (function(a){
            console.log("self execution");
        }(a));
     </script>
</head>
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我得到了输出

self execution 
shouldn't be executed 
Run Code Online (Sandbox Code Playgroud)

如果我将呼叫改为

<head>
    <script>
        var a = {}

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

        a.X = x;

        (function(a){
            console.log("self execution");
        }(a));
     </script>
</head>
Run Code Online (Sandbox Code Playgroud)

然后我就明白了

self execution
Run Code Online (Sandbox Code Playgroud)

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

Que*_*tin 22

;分配函数后,您将丢失a.X.

不会触发分号插入.

在(和)周围的匿名函数来调用以前的功能,其返回值被分配到X.

即你所拥有的相当于:

var a = {};

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

顺便说一句,这个问题对JS Lint来说是一个很好的广告,它本来可以把它拿起来.

  • 大声笑我刚才注意到了.这就是为什么你**应该使用**分号! (2认同)