JS自执行匿名函数的几种方式和性能对比
日期:2018-03-13
来源:程序思维浏览:1519次
自执行匿名函数在原生的javascript中使用率不是太高,但是在jQuery里面到处都是,可能大家不注意,不知道什么是自执行匿名函数,但是在无意当中已经在实用了,下面我给大家说一下,声明自执行匿名函数的几种方法和性能的对比:
常见的自执行匿名函数:
第一种:
(function() {
alert('Hello World!');
})();
这种比较常见。
第二种:
(function(param) {
alert(param); //结果:张三
})('张三');
这种是自执行函数的传参。
第三种:
(function(param) {
alert(param);
return arguments.callee; //结果:html5,php
})('html5')('php');
咱们再看看不常见的只执行匿名函数:
第四种:
~(function(){
alert('hellow world!');
})();
第五种:
void function(){
alert('hellow world!');
}();
第六种:
+function(){
alert('hellow world!');
}();
第七种:
-function(){
alert('hellow world!');
}();
第八种:
!function(){
alert('hellow world!');
}();
第九种:
(function(){
alert('hellow world!');
}());
自执行函数的性能对比:
绿颜色最好,没有颜色一般,红色最慢。
可见不同的方式产生的结果并不相同,而且,差别很大,因浏览器而异。
但我们还是可以从中找出很多共性:new方法永远最慢——这也是理所当然的。其它方面很多差距其实不大,但有一点可以肯定的是,感叹号并非最为理想的选择。反观传统的括号,在测试里表现始终很快,在大多数情况下比感叹号更快——所以平时我们常用的方式毫无问题,甚至可以说是最优的。加减号在chrome表现惊人,而且在其他浏览器下也普遍很快,相比加号效果更好。
当然这只是个简单测试,不能说明问题。但有些结论是有意义的:括号和加减号最优。
大家可以自己去https://jsperf.com/js-funcion-expression-speed这个网站测试一下,每个浏览器和每个机器测试的结果都不一样哦!
常见的自执行匿名函数:
第一种:
(function() {
alert('Hello World!');
})();
这种比较常见。
第二种:
(function(param) {
alert(param); //结果:张三
})('张三');
这种是自执行函数的传参。
第三种:
(function(param) {
alert(param);
return arguments.callee; //结果:html5,php
})('html5')('php');
咱们再看看不常见的只执行匿名函数:
第四种:
~(function(){
alert('hellow world!');
})();
第五种:
void function(){
alert('hellow world!');
}();
第六种:
+function(){
alert('hellow world!');
}();
第七种:
-function(){
alert('hellow world!');
}();
第八种:
!function(){
alert('hellow world!');
}();
第九种:
(function(){
alert('hellow world!');
}());
自执行函数的性能对比:
Option | Code | Ops/sec | |||
Chrome 13 | Firefox 6 | IE9 | Safari 5 | ||
! | !function(){;}() | 3,773,196 | 10,975,198 | 572,694 | 2,810,197 |
+ | +function(){;}() | 21,553,847 | 12,135,960 | 572,694 | 1,812,238 |
- | -function(){;}() | 21,553,847 | 12,135,960 | 572,694 | 1,864,155 |
~ | ~function(){;}() | 3,551,136 | 3,651,652 | 572,694 | 1,876,002 |
(1) | (function(){;})() | 3,914,953 | 12,135,960 | 572,694 | 3,025,608 |
(2) | (function(){;}()) | 4,075,201 | 12,135,960 | 572,694 | 3,025,608 |
void | void function(){;}() | 4,030,756 | 12,135,960 | 572,694 | 3,025,608 |
new | new function(){;}() | 619,606 | 299,100 | 407,104 | 816,903 |
delete | delete function(){;}() | 4,816,225 | 12,135,960 | 572,694 | 2,693,524 |
= | var i = function(){;}() | 4,984,774 | 12,135,960 | 565,982 | 2,602,630 |
&& | 1 && function(){;}() | 5,307,200 | 4,393,486 | 572,694 | 2,565,645 |
|| | 0 || function(){;}() | 5,000,000 | 4,406,035 | 572,694 | 2,490,128 |
& | 1 & function(){;}() | 4,918,209 | 12,135,960 | 572,694 | 1,705,551 |
| | 1 | function(){;}() | 4,859,802 | 12,135,960 | 572,694 | 1,612,372 |
^ | 1 ^ function(){;}() | 4,654,916 | 12,135,960 | 572,694 | 1,579,778 |
, | 1, function(){;}() | 4,878,193 | 12,135,960 | 572,694 | 2,281,186 |
绿颜色最好,没有颜色一般,红色最慢。
可见不同的方式产生的结果并不相同,而且,差别很大,因浏览器而异。
但我们还是可以从中找出很多共性:new方法永远最慢——这也是理所当然的。其它方面很多差距其实不大,但有一点可以肯定的是,感叹号并非最为理想的选择。反观传统的括号,在测试里表现始终很快,在大多数情况下比感叹号更快——所以平时我们常用的方式毫无问题,甚至可以说是最优的。加减号在chrome表现惊人,而且在其他浏览器下也普遍很快,相比加号效果更好。
当然这只是个简单测试,不能说明问题。但有些结论是有意义的:括号和加减号最优。
大家可以自己去https://jsperf.com/js-funcion-expression-speed这个网站测试一下,每个浏览器和每个机器测试的结果都不一样哦!
精品好课