标签:
参考链接:
http://benalman.com/news/2010/11/immediately-invoked-function-expression/#iife
http://segmentfault.com/a/1190000003985390
IIFE是在后面进入模块编程看到的,对于它长成那个样子,原来也是和闭包那块经常一块出在面试题里的,让人容易脸盲|||
本文用于初识庐山面目,欢迎各路大侠吐槽~
IIFE-immediately invoked function expression,立即执行函数
格式:( function(){...}() );
推理:
首先,通常先定义一个函数 function a(){}; 或者 var a = function(){}; ,函数的调用为 a();
那么,既然要立即执行,想想就是定义跟调用拼一块,把a()中的a替换成定义,即:
function a(){}();//语法错误类型1,因为这时最后面的那对括号,放在一个函数声明的后面,表明完全和前面的函数声明分开,这时括号是有限运算符的括号,作为运算符的括号里头需要放表达式,没有的话就报错;
function(){}();//语法错误类型2,当我们用圆括号是为了调用函数而出现在函数后面时,因为遇到function关键字,首先默认是把它识别为函数声明,除非我们告诉括号前面是函数表达式,既然我们也没告诉括号这是函数表达式,它识别为函数声明时发现声明少了名字,就先报错了;如果把名字补上,就同第一种情况报错;
var a = function(){}();//语法正确,这时,最后那对括号终于认为前面是表达式了
其中,涉及到javascript中语法解析器如何解读“()”,现在我只知道:(statement声明)是错的,(expression表达式)是对的;
总结一下:
1. 声明+() //括号充当优先运算符,和前者无干系,直接这么写是报错的
2. 函数表达式+() //函数调用成功
3.(函数定义) //默认将函数当作函数表达式去解析,而不是函数声明
所以,IIFE的写法就有了:
写法1. (function(){})(); //包裹函数的那对括号强制函数直接量即里头那个匿名函数执行,返回一个引用,类似于表达式里指向匿名函数的变量名,在跟最后那对括号一起调用,执行函数;
写法2. (function(){}()); //如果去掉最外层的括号,函数体后的那对括号就不高兴,导致上文的语法错误类型2产生,有了最外层括号充当强制运算符,解释器会把里面的函数当成表达式,再匹配旁边的括号立即执行;
IIFE的用途:
1. 模拟块作用域,模块模式
2. 用来锁定值,保存此时的状态
如保存闭包的状态,通常会有循环给元素绑定事件:
for(var i=...){
function(index){//用来锁定每次循环时i的值
//原本的循环里的绑定事件注册代码
}(i);
}
Hum~~先回家,慢慢(ˇ?ˇ) 想~
标签:
原文地址:http://www.cnblogs.com/ilovews/p/5020660.html