这两天经理让我出一套js的面试题,我自己都是个刚进入前端的菜鸟,这怎么办啊,赶紧补基础呗。正好这两天项目也做完了,赶紧补充一下基础,临时抱拂脚,不能完全运用,至少也能说出点东西来吧。首先研究的就是js的立即执行函数,以前觉得那叫一个高级啊,有时候用加号有时候用括号,在代码中可以直接执行,仔细看看原来这么简单,这里总结一下吧。
1.语法
通常我们使用的是两种(function(){})()或者是(function(){}()),但其实包裹function的那层小括号可以用很多运算符来代替,什么+,-,!啦之类的等等运算符,甚至void,new也可以将其转换为函数表达式,然后再加"()"立即执行。
2.为什么一定要使用IIFE(Imdiately Invoked Function Expression)
a)传统的方法啰嗦,定义和执行分开写
b)传统的方法直接污染全局命名空间
一般来说定义函数有两种方式
//函数声明语句写法 function test(){}; test(); //函数表达式写法 var test = function(){}; test();
不难看出,其实在函数后面用()即是调用该函数,那么能不能写function test(){}()呢?答案是不能,因为function test(){}这个部分只是一个声明,对于解释器来说,就好像你写了一个字符串 "function test(){}"
,它需要使用解析函数,比如eval()
来执行它才可以。所以把 () 直接放在声明后面是不会执行,这是错误的语法。变正确的方式很简单,只需要把声明变成 表达式(Expression)就可以了。最常见的办法就是用()括起来,所以才有上述第一点中很多运算符都能立即执行,因为都将声明变成了表达式。
3.参数
立即执行函数不去污染全局命名空间,是因为 IIFE 创建了一个新的函数作用域。如果你需要全局对象,那就 pass 给 IIFE。
(function (global) { // 在这里,global就是全局对象了 })(this)// 在浏览器里,this就是 window 对象
4.使用时机
a)当我们需要写一个js文件,并且复用率很高的时候,建议使用。
b)如果声明的函数只需要调用一次,建议使用。
c)独立模块,这个和第一点差不多。单独提出来,是想强调一下立即执行函数的好处,开发时,它能做到各模块的低耦合,减少对全局作用域的污染。
p.s:其实很多人也叫立即执行函数为匿名函数,其实立即执行函数可以有函数名的哦,不信你自己试试吧。
参考链接:
https://segmentfault.com/q/1010000000442042