立即执行函数在js中是作为一个单独的语句存在的,是一个独立的表达式,()括号能够求得一个数值,使得函数执行。
表达式是由数字、运算符、数字分组符号(如括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合。
先看一个最简单的形式:
(function(){})();
我们了解了表达式就能很清楚的看明白这是什么结构了
(函数定义表达式)函数调用表达式
也就是说先创建了一个匿名函数,然后不传入参数调用它,这就变成了立即执行函数,知道了这些看个传入参数调用的立即执行函数题目
- 看一个列子。
1
2
3(function f(f){
return typeof f();
})(function(){return 1;});// "number"
这个题目事实上还涉及了一些其它的知识,立即执行函数不再是以空括号()来调用了,同时传入了一个function作为参数传入调用。
再一个疑惑就是typeof f() 中的f究竟指谁,简单说一下,当函数执行有命名冲突的时候,函数依次填入 变量=>函数=>参数,所以最后被填入的参数f会覆盖函数定义f,typeof f()是对参数的调用,参数是立即执行函数传入的function参数,返回数字1,typeof 1是 “number”。
另外()括号将整个函数和调用包含起来也可以
1
2
3(function f(f){
return f;
}(3));// "number"或者常常将函数名省去
1
2
3(function(f){
return f;
})(3);// "number"
此处未涉及到作用域,立即执行函数本质上是一个表达式,所以它会执行,执行后就被释放了,语句在()括号内有效