原文:javascript立即调用的函数表达式N种写法(第二篇)
上一篇博客我谈到将函数声明转换为函数表达式最常见的一种写法是:通过括号()将匿名函数声明转换为函数表达式即(function(){})();
言外之意就是还有其他方式,记住:任何消除函数声明和函数表达式间歧义的方法,都可以被解析器正确识别!它们可以分为5类,超过10多种:
(function(){})(); //最常见的写法 下文没特殊指明就是指它
(function(){}); //容易与上面的混淆
[function()()]; //一元运算符
~function(){};
+function(){};
-function(){};
!function(){}; //常见于一些第3方代码 //关键字
delete function() {}();
typeof function() {}();
void function() {}();
new function() {}();
new function() {}; var f = function() {}(); 1, function() {}();
1 ^ function() {}();
1 > function() {}();
1 && function(){}();
//...
当然,它们之间也有性能的差异:new永远是最慢的,+-在chrome速度惊人,常见的()和!在各浏览器中的表现也算上乘,另外+-比()少一个字符。
解惑:我们可能经常看到一些插件前面会加一个;分号,我的理解如下:
glue()
//插件
(function(){
//.....前面应该加;分号
})();
//Uncaught TypeError: undefined is not a function
glue()函数和插件单独执行是没有错误的,但是当glue()与插件通过某种方式合并在一起了就会报错。所以我们可以这样去写:
;(function(){
//省略一段代码
})();
--------------------------
;!function(){
//省略一段代码
}();
---------------------------
;+function(){
//省略一段代码
}();
----------------------------
//等等
以上学会可当装逼之用(~><~),同时再也不会为看不懂别人的代码而烦恼了!