var a = 1;
var b = 2;
(function() {
var b = 3;
a += b;
})();
a; // 4
b; // 2
答案 0 :(得分:0)
在函数内部编写var b时,var关键字使其成为局部变量。因此,函数内部的var b是局部变量,函数外部顶部的var b在全局范围内。您可以在MDN中阅读有关范围界定的更多信息。此外,函数之后的()被称为立即函数调用,这意味着函数在定义后很快就会被调用。此外,由于函数内部在声明之前没有var,它将采用全局a为1并添加3,局部变量b的值。
答案 1 :(得分:0)
简单地立即调用该函数。这就是最后一个括号的用途。函数声明周围的额外括号是因为
function() {
var b = 3;
a += b;
}();
会产生语法错误,因为function
关键字不会被解释为此处的表达式。
以及为什么函数内部的var b不替换第一个var b的值,因为它没有使用关键字let,这将使b保持在该函数的本地,
您可能听说过let
的特殊之处在于它是块范围的。确实如此。但是var
一直是作用于函数的,因为第二个var b
在它自己的函数中,它的作用域是该函数,并且不会影响顶部作用域中的b
。
答案 2 :(得分:0)
模板
(function(){})();
是匿名函数的模板
为了解释它,让我们创建一个警告'hello'的函数x()
:
function x() {
alert('hello');
}
要致电x
,我们会:
x();
现在,很明显,如果我们用它的值替换对象的名称,statememt将保持不变(例如var k = 5; alert(k); alert(5)
- 两个警报是相同的,因为变量的名称被替换为它的值)。
在我们的例子中,x
的值是:
function(){
警报( '你好');
}
因此,如果我们在x
语句中将x();
替换为{ - 1}} - >
(function () {
alert('hello');
})();
这就是语法的来源。结果将立即调用指定的函数。当然,这种语法也适用于带有返回类型的参数和函数的函数。