为什么调用该函数?JavaScript/窗口

为什么调用该函数?JavaScript/窗口,javascript,Javascript,我的HTML文件中有以下代码: <script type="text/javascript"> window.never = function() { console.log('this function is never called'); } (function(d, s, id){ var js, srjs = d.getElementsByTagName(s)[0

我的HTML文件中有以下代码:

    <script type="text/javascript">
        window.never = function() {
                 console.log('this function is never called');
        }
        (function(d, s, id){
            var js, srjs = d.getElementsByTagName(s)[0];
            if (d.getElementById(id)) {return;}
            js = d.createElement(s); js.id = id;
            js.src = "this.script.does.not.exist.js";
            srjs.parentNode.insertBefore(js, srjs);
        }(document, 'script', 'streamrail-jssdk'));
    </script>
那就不叫了


有人能解释一下为什么调用window.never函数吗?什么触发了呼叫?我想这与窗口对象上的函数有关,但我看不出其背后的原因。

函数表达式后面是括号:

 window.never = function() { ... }
 (...)
函数表达式后的换行符不会终止变量语句,因此对于解析器而言,这是一个函数调用:

function() { ... }(...)
事实上,您在这里使用的是相同的技术:

(function(d, s, id){
  // ...
}(document, 'script', 'streamrail-jssdk'))
这是一个函数表达式,后跟
(…)
,它调用函数

解决方案:在定义后添加一个分号,就可以了


如果我将“从不”函数更改为不在全局范围内。。。那就不叫了


在这种情况下,函数定义被解释为函数声明,而不是表达式。函数声明更像一个语句,因此不能是CallExpression的一部分。因此,以下括号被解释为分组运算符(如您所期望的)。

将分号放在函数声明之后:

    window.never = function() {
             console.log('this function is never called');
    };
这是因为后面直接触发函数调用的
(…)

    window.never = function() {
             console.log('this function is never called');
    }
    ( ... ) // <-- Triggers call of `window.never`
window.never=function(){
log('从未调用此函数');
}

(…)//简单地说,您有一个语法错误。:)这也是一个副本,但我找不到。
var log=function(){console.log('this function's called');}(42)
关于依赖自动分号插入,您学到了什么?
    window.never = function() {
             console.log('this function is never called');
    }
    ( ... ) // <-- Triggers call of `window.never`