这不是What is the (function() { } )() construct in JavaScript?
的副本因为我完全知道语法的含义:自我执行功能。
为什么我需要这种语法来自行执行一个函数:
(function() {
alert('I don\'t have a name, I AM anonymous and I\'m autoexecuting myself');
}());
虽然这种语法不起作用:
(function() {
alert('I don\'t have a name, I AM anonymous and I\'m autoexecuting myself');
});
答案 0 :(得分:7)
这是因为没有任何东西正在执行该功能。通常*这是在最后用括号完成的。包装括号不是使其成为立即调用的函数的原因。例如:
var f = function() {
console.log('Call f');
return 1;
};
这定义了一个你以后可以调用的函数,对吧?所以要调用它,你会这样做:
f();
现在想象一下:
var f = function() {
console.log('Call f');
return 1;
}();
由于您调用了该函数,f
将等于1
。附加的包装括号帮助读者知道该函数将立即执行。这就是为什么你可以做以下任何一个(以及更多):
function() {
...
}();
(function() {
...
}());
!function() {
...
}();
// This one seems to be the most common
(function() {
...
})();
对于将来的信息,这实际上被称为immediately-invoked function expression or IIFE。
*此规则有一些例外情况。具体来说,您可以将new
用于不带参数的函数,并且可以在对象上使用getter和setter。有关详细信息,请参阅this question。
答案 1 :(得分:1)
因为必须调用函数才能运行,并使用()
调用函数。
答案 2 :(得分:0)
(function(){ ... })()
是一个函数调用,其中(function() { ... })
是一个带括号的函数表达式,它不会调用函数,无论如何读取这个https://github.com/getify/You-Dont-Know-JS,你都不会后悔! / p>