在某些情况下,我们不需要函数创建多个实例,也不需要对返回值做什么处理,便可以通过在函数声明的后面添加()
来实现自执行。因为foo
仅仅是function(){}
这个表达式的一个引用,在函数表达时候后添加()
便可以执行。1
2
3var foo = function(){
//do something.
}();
但如果我们像下面这么写,会报错:
1 | function(){ |
给括号里加入参数的话,可以不报错,但是函数不会执行,因为它会被解析成一个毫不相关的括号。
报错原因:解析代码的时候,function已经被识别为声明函数用,而不是一个函数表达式。
所以我们要做的就是把括号前面的内容解析成表达式,以下的写法都可以:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31(function makeCounter(){
console.log("invoked by ()");
}());
var x = function makeCounter(){
console.log("invoked by var with ()");
}();
!function(){
console.log("invoked by !");
}();
~function(){
console.log("invoked by ~");
}();
+function(){
console.log("invoked by +");
}();
-function(){
console.log("invoked by -");
}();
new function(){
console.log("invoked by new");
};
new function(){
console.log("invoked by new with ()");
}();