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