为什么要执行这个函数?

Why is this function executed?

我需要帮助来理解以下脚本的工作原理。

var foo = function() {
    console.log("A");
}

(function() {
    // Empty
})

当 运行 此脚本带有节点 (v5.9.1) 时,输出为 "A"。我希望它什么都不做。这里为什么执行foo?我可以删除第一行或最后三行,然后就没有输出了。

如果将 (...) 紧跟在函数表达式之后,就会执行该函数。

问题中的代码定义了一个调用console.log的函数。然后它调用该函数(向它传递一个函数的参数(未使用),该函数无论如何都不执行任何操作)。然后将调用第一个函数的return值赋值给foo.

可以改写为:

var function_a = function() {console.log("A");};
var function_b = function() {};
var foo = function_a(function_b);

…唯一的副作用是创建了 function_afunction_b 变量。


分号插入通常被认为是有害的,因为它会导致人们期望空格将语句分隔成两个不相关的表达式。

JSHint 会警告您这个问题:

7 Missing semicolon.

JavaScript 将 (...) 解释为对先前定义的函数的调用(请注意,您将另一个函数作为参数传递,在 foo 中将被忽略),因为两者之间没有任何内容}( 个符号。

用你的代码

var foo = function() {
    console.log("A");
}

(function() {
    // Empty
})

javascript 解释器正在读这个:

var foo = function() {
    console.log("A");
}(function() {});

对于解释器,你声明了一个匿名函数,并向它传递了一个参数,它 returns 什么都没有,那么 foo 的值是 undefined

这就是为什么在必要时在每一行的末尾放置 ; 非常重要的原因。