js立即执行函数

  这两天经理让我出一套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

posted @ 2017-03-15 12:34  zmc_change  阅读(690)  评论(0编辑  收藏  举报