转载,js中的匿名函数

楼主
转载,js中的匿名函数
[P][/P][P][/P][P][/P][P]刚刚在工作中发现了在function前加入!~的方法,于是查了一下。发现真的有很多我还不知道的地方。[/P][P] 最普通的匿名函数:[/P][P][/P][P][/P][ol][li](function(){}())[/li][/ol][P][/P][i]复制代码[/i][P][/P][P]或者[/P][P][/P][P][/P][P][/P][ol][li](function(){})()[/li][/ol][P][/P][i]复制代码[/i][P][/P][P]后来发现:[/P][P][/P][P][/P][ol][li]!function(){}()[/li][/ol][P][/P][i]复制代码[/i][P][/P][P]这样的写法和上面的等同,下面我引用别人的例子:[/P][P][BGCOLOR=rgb(248, 248, 248)][FACE=arial, sans-serif, Verdana][COLOR=rgb(51, 153, 51)]![/BGCOLOR][COLOR=rgb(0, 51, 102)][b]function[/b][/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]{[/COLOR][COLOR=rgb(0, 0, 102)]alert[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(51, 102, 204)]'iifksp'[/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]}[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR]        [COLOR=rgb(0, 102, 0)][i]// true[/i][/COLOR][/FACE][/COLOR][/P][P][/P][P][/P][P][/P][P][/P][P][ALIGN=left][COLOR=rgb(34, 34, 34)][BGCOLOR=rgb(240, 231, 180)][FACE=arial, sans-serif, Verdana]在控制台运行后得到的值时true,为什么是true这很容易理解,因为这个匿名函数没有返回值,默认返回的就是undefined,求反的结果很自然的就是true。所以问题并不在于结果值,而是在于,为什么求反操作能够让一个匿名函数的自调变的合法?[/COLOR][/BGCOLOR][/FACE][/ALIGN][/P][P][/P][P][/P][P][/P][P][/P][P][ALIGN=left][COLOR=rgb(34, 34, 34)][BGCOLOR=rgb(240, 231, 180)][FACE=arial, sans-serif, Verdana]平时我们可能对添加括号来调用匿名函数的方式更为习惯:[/COLOR][/BGCOLOR][/FACE][/ALIGN][/P][P][/P][P][/P][P][BGCOLOR=rgb(248, 248, 248)][FACE=arial, sans-serif, Verdana][COLOR=rgb(0, 153, 0)]([/BGCOLOR][COLOR=rgb(0, 51, 102)][b]function[/b][/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]{[/COLOR][COLOR=rgb(0, 0, 102)]alert[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(51, 102, 204)]'iifksp'[/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]}[/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR]        [COLOR=rgb(0, 102, 0)][i]// true[/i][/COLOR][/FACE][/COLOR][/P][P][/P][P][/P][P][/P][P][/P][P][ALIGN=left][COLOR=rgb(34, 34, 34)][BGCOLOR=rgb(240, 231, 180)][FACE=arial, sans-serif, Verdana]或者:[/COLOR][/BGCOLOR][/FACE][/ALIGN][/P][P][/P][P][/P][P][BGCOLOR=rgb(248, 248, 248)][FACE=arial, sans-serif, Verdana][COLOR=rgb(0, 153, 0)]([/BGCOLOR][COLOR=rgb(0, 51, 102)][b]function[/b][/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]{[/COLOR][COLOR=rgb(0, 0, 102)]alert[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(51, 102, 204)]'iifksp'[/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]}[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR]        [COLOR=rgb(0, 102, 0)][i]// true[/i][/COLOR][/FACE][/COLOR][/P][P][/P][P][/P][P][/P][P][/P][P][ALIGN=left][COLOR=rgb(34, 34, 34)][BGCOLOR=rgb(240, 231, 180)][FACE=arial, sans-serif, Verdana]虽然上述两者括号的位置不同,不过效果完全一样。[/COLOR][/BGCOLOR][/FACE][/ALIGN][/P][P][/P][P][/P][P][/P][P][/P][P][ALIGN=left][COLOR=rgb(34, 34, 34)][BGCOLOR=rgb(240, 231, 180)][FACE=arial, sans-serif, Verdana]那么,是什么好处使得为数不少的人对这种叹号的方式情有独钟?如果只是为了节约一个字符未免太没有必要了,这样算来即使一个100K的库恐怕也节省不了多少空间。既然不是空间,那么就是说也许还有时间上的考量,事实很难说清,文章的最后有提到性能。[/COLOR][/BGCOLOR][/FACE][/ALIGN][/P][P][/P][P][/P][P][/P][P][/P][P][ALIGN=left][COLOR=rgb(34, 34, 34)][BGCOLOR=rgb(240, 231, 180)][FACE=arial, sans-serif, Verdana]回到核心问题,为什么能这么做?甚至更为核心的问题是,为什么必须这么做?[/COLOR][/BGCOLOR][/FACE][/ALIGN][/P][P][/P][P][/P][P][/P][P][/P][P][ALIGN=left][COLOR=rgb(34, 34, 34)][BGCOLOR=rgb(240, 231, 180)][FACE=arial, sans-serif, Verdana]其实无论是括号,还是感叹号,让整个语句合法做的事情只有一件,就是[b]让一个函数声明语句变成了一个表达式[/b]。[/COLOR][/BGCOLOR][/FACE][/ALIGN][/P][P][/P][P][/P][P][BGCOLOR=rgb(248, 248, 248)][FACE=arial, sans-serif, Verdana][COLOR=rgb(0, 51, 102)][b]function[/b][/BGCOLOR] a[COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]{[/COLOR][COLOR=rgb(0, 0, 102)]alert[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(51, 102, 204)]'iifksp'[/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]}[/COLOR]        [COLOR=rgb(0, 102, 0)][i]// undefined[/i][/COLOR][/FACE][/COLOR][/P][P][/P][P][/P][P][/P][P][/P][P][ALIGN=left][COLOR=rgb(34, 34, 34)][BGCOLOR=rgb(240, 231, 180)][FACE=arial, sans-serif, Verdana]这是一个函数声明,如果在这么一个声明后直接加上括号调用,解析器自然不会理解而报错:[/COLOR][/BGCOLOR][/FACE][/ALIGN][/P][P][/P][P][/P][P][BGCOLOR=rgb(248, 248, 248)][FACE=arial, sans-serif, Verdana][COLOR=rgb(0, 51, 102)][b]function[/b][/BGCOLOR] a[COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]{[/COLOR][COLOR=rgb(0, 0, 102)]alert[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(51, 102, 204)]'iifksp'[/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]}[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR]        [COLOR=rgb(0, 102, 0)][i]// SyntaxError: unexpected_token[/i][/COLOR][/FACE][/COLOR][/P][P][/P][P][/P][P][/P][P][/P][P][ALIGN=left][COLOR=rgb(34, 34, 34)][BGCOLOR=rgb(240, 231, 180)][FACE=arial, sans-serif, Verdana]因为这样的代码混淆了函数声明和函数调用,以这种方式声明的函数a,就应该以 a(); 的方式调用。[/COLOR][/BGCOLOR][/FACE][/ALIGN][/P][P][/P][P][/P][P][/P][P][/P][P][ALIGN=left][COLOR=rgb(34, 34, 34)][BGCOLOR=rgb(240, 231, 180)][FACE=arial, sans-serif, Verdana]但是括号则不同,它将一个函数声明转化成了一个表达式,解析器不再以函数声明的方式处理函数a,而是作为一个函数表达式处理,也因此只有在程序执行到函数a时它才能被访问。[/COLOR][/BGCOLOR][/FACE][/ALIGN][/P][P][/P][P][/P][P][/P][P][/P][P][ALIGN=left][COLOR=rgb(34, 34, 34)][BGCOLOR=rgb(240, 231, 180)][FACE=arial, sans-serif, Verdana]所以,[b]任何消除函数声明和函数表达式间歧义的方法,都可以被解析器正确识别[/b]。比如:[/COLOR][/BGCOLOR][/FACE][/ALIGN][/P][P][/P][P][/P][P][BGCOLOR=rgb(248, 248, 248)][FACE=arial, sans-serif, Verdana][COLOR=rgb(0, 51, 102)][b]var[/b][/BGCOLOR] i [COLOR=rgb(51, 153, 51)]=[/COLOR] [COLOR=rgb(0, 51, 102)][b]function[/b][/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]{[/COLOR][COLOR=rgb(0, 0, 102)][b]return[/b][/COLOR] [COLOR=rgb(204, 0, 0)]10[/COLOR][COLOR=rgb(0, 153, 0)]}[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(51, 153, 51)];[/COLOR]        [COLOR=rgb(0, 102, 0)][i]// undefined[/i][/COLOR][COLOR=rgb(204, 0, 0)]1[/COLOR] [COLOR=rgb(51, 153, 51)]&&[/COLOR] [COLOR=rgb(0, 51, 102)][b]function[/b][/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]{[/COLOR][COLOR=rgb(0, 0, 102)][b]return[/b][/COLOR] [COLOR=rgb(0, 51, 102)][b]true[/b][/COLOR][COLOR=rgb(0, 153, 0)]}[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(51, 153, 51)];[/COLOR]        [COLOR=rgb(0, 102, 0)][i]// true[/i][/COLOR][COLOR=rgb(204, 0, 0)]1[/COLOR][COLOR=rgb(51, 153, 51)],[/COLOR] [COLOR=rgb(0, 51, 102)][b]function[/b][/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]{[/COLOR][COLOR=rgb(0, 0, 102)]alert[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(51, 102, 204)]'iifksp'[/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]}[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(51, 153, 51)];[/COLOR]        [COLOR=rgb(0, 102, 0)][i]// undefined[/i][/COLOR][/FACE][/COLOR][/P][P][/P][P][/P][P][/P][P][/P][P][ALIGN=left][COLOR=rgb(34, 34, 34)][BGCOLOR=rgb(240, 231, 180)][FACE=arial, sans-serif, Verdana]赋值,逻辑,甚至是逗号,各种操作符都可以告诉解析器,这个不是函数声明,它是个函数表达式。并且,对函数一元运算可以算的上是消除歧义最快的方式,感叹号只是其中之一,如果不在乎返回值,这些[b]一元运算都是有效的[/b]:[/COLOR][/BGCOLOR][/FACE][/ALIGN][/P][P][/P][P][/P][P][BGCOLOR=rgb(248, 248, 248)][FACE=arial, sans-serif, Verdana][COLOR=rgb(51, 153, 51)]![/BGCOLOR][COLOR=rgb(0, 51, 102)][b]function[/b][/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]{[/COLOR][COLOR=rgb(0, 0, 102)]alert[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(51, 102, 204)]'iifksp'[/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]}[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR]        [COLOR=rgb(0, 102, 0)][i]// true[/i][/COLOR][COLOR=rgb(51, 153, 51)]+[/COLOR][COLOR=rgb(0, 51, 102)][b]function[/b][/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]{[/COLOR][COLOR=rgb(0, 0, 102)]alert[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(51, 102, 204)]'iifksp'[/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]}[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR]        [COLOR=rgb(0, 102, 0)][i]// NaN[/i][/COLOR][COLOR=rgb(51, 153, 51)]-[/COLOR][COLOR=rgb(0, 51, 102)][b]function[/b][/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]{[/COLOR][COLOR=rgb(0, 0, 102)]alert[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(51, 102, 204)]'iifksp'[/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]}[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR]        [COLOR=rgb(0, 102, 0)][i]// NaN[/i][/COLOR]~[COLOR=rgb(0, 51, 102)][b]function[/b][/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]{[/COLOR][COLOR=rgb(0, 0, 102)]alert[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(51, 102, 204)]'iifksp'[/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]}[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR]        [COLOR=rgb(0, 102, 0)][i]// -1[/i][/COLOR][/FACE][/COLOR][/P][P][/P][P][/P][P][/P][P][/P][P][ALIGN=left][COLOR=rgb(34, 34, 34)][BGCOLOR=rgb(240, 231, 180)][FACE=arial, sans-serif, Verdana]甚至下面这些关键字,都能很好的工作:[/COLOR][/BGCOLOR][/FACE][/ALIGN][/P][P][/P][P][/P][P][BGCOLOR=rgb(248, 248, 248)][FACE=arial, sans-serif, Verdana][COLOR=rgb(0, 0, 102)][b]void[/b][/BGCOLOR] [COLOR=rgb(0, 51, 102)][b]function[/b][/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]{[/COLOR][COLOR=rgb(0, 0, 102)]alert[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(51, 102, 204)]'iifksp'[/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]}[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR]        [COLOR=rgb(0, 102, 0)][i]// undefined[/i][/COLOR][COLOR=rgb(0, 51, 102)][b]new[/b][/COLOR] [COLOR=rgb(0, 51, 102)][b]function[/b][/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]{[/COLOR][COLOR=rgb(0, 0, 102)]alert[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(51, 102, 204)]'iifksp'[/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]}[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR]        [COLOR=rgb(0, 102, 0)][i]// Object[/i][/COLOR][COLOR=rgb(0, 0, 102)][b]delete[/b][/COLOR] [COLOR=rgb(0, 51, 102)][b]function[/b][/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]{[/COLOR][COLOR=rgb(0, 0, 102)]alert[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(51, 102, 204)]'iifksp'[/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]}[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR]        [COLOR=rgb(0, 102, 0)][i]// true[/i][/COLOR][/FACE][/COLOR][/P][P][/P][P][/P][P][/P][P][/P][P][ALIGN=left][COLOR=rgb(34, 34, 34)][BGCOLOR=rgb(240, 231, 180)][FACE=arial, sans-serif, Verdana]最后,括号做的事情也是一样的,消除歧义才是它真正的工作,而不是把函数作为一个整体,所以无论括号括在声明上还是把整个函数都括在里面,都是合法的:[/COLOR][/BGCOLOR][/FACE][/ALIGN][/P][P][/P][P][/P][P][BGCOLOR=rgb(248, 248, 248)][FACE=arial, sans-serif, Verdana][COLOR=rgb(0, 153, 0)]([/BGCOLOR][COLOR=rgb(0, 51, 102)][b]function[/b][/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]{[/COLOR][COLOR=rgb(0, 0, 102)]alert[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(51, 102, 204)]'iifksp'[/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]}[/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR]        [COLOR=rgb(0, 102, 0)][i]// undefined[/i][/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 51, 102)][b]function[/b][/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]{[/COLOR][COLOR=rgb(0, 0, 102)]alert[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(51, 102, 204)]'iifksp'[/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)]}[/COLOR][COLOR=rgb(0, 153, 0)]([/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR][COLOR=rgb(0, 153, 0)])[/COLOR]        [COLOR=rgb(0, 102, 0)][i]// undefined[/i][/COLOR][/FACE][/COLOR][/P][P][/P][P][/P][P][/P][P][/P][P][ALIGN=left][COLOR=rgb(34, 34, 34)][BGCOLOR=rgb(240, 231, 180)][FACE=arial, sans-serif, Verdana]说了这么多,实则在说的一些都是最为基础的概念——语句,表达式,表达式语句,这些概念如同指针与指针变量一样容易产生混淆。虽然这种混淆对编程无表征影响,但却是一块绊脚石随时可能因为它而头破血流。[/COLOR][/BGCOLOR][/FACE][/ALIGN][/P][P][/P][P][/P][P][/P][P][/P][P][ALIGN=left][COLOR=rgb(34, 34, 34)][BGCOLOR=rgb(240, 231, 180)][FACE=arial, sans-serif, Verdana]最后讨论下性能。我在jsperf上简单建立了一个测试:[COLOR=rgb(89, 100, 133)][u][url=]http://jsperf.com/js-funcion-expression-speed[/url][/u][/COLOR],可以用不同浏览器访问,运行测试查看结果。我也同时将结果罗列如下表所示(由于我比较穷,测试配置有点丢人不过那也没办法:奔腾双核1.4G,2G内存,win7企业版):[/BGCOLOR][/FACE][/COLOR][/ALIGN][/P][P][/P][P][/P][TABLE=transparent,0,0,98%,left,rgb(240, 231, 180),0,none][tr][TD=1,2,#00ef0e]Option[/td][TD=1,2,#00ef0e]Code[/td][TD=4,1,#00ef0e]Ops/sec[/td][/tr][tr][td]Chrome 13[/td][td]Firefox 6[/td][td]IE9[/td][td]Safari 5[/td][/tr][tr][td]![/td][td]!function(){;}()[/td][td][P][/P][P][/P][P][ALIGN=right]3,773,196[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]10,975,198[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]572,694[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]2,810,197[/ALIGN][/P][P][/P][P][/P][/td][/tr][tr][td]+[/td][td]+function(){;}()[/td][td][P][/P][P][/P][P][ALIGN=right]21,553,847[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]12,135,960[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]572,694[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]1,812,238[/ALIGN][/P][P][/P][P][/P][/td][/tr][tr][td]-[/td][td]-function(){;}()[/td][td][P][/P][P][/P][P][ALIGN=right]21,553,847[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]12,135,960[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]572,694[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]1,864,155[/ALIGN][/P][P][/P][P][/P][/td][/tr][tr][td]~[/td][td]~function(){;}()[/td][td][P][/P][P][/P][P][ALIGN=right]3,551,136[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]3,651,652[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]572,694[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]1,876,002[/ALIGN][/P][P][/P][P][/P][/td][/tr][tr][td](1)[/td][td](function(){;})()[/td][td][P][/P][P][/P][P][ALIGN=right]3,914,953[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]12,135,960[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]572,694[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]3,025,608[/ALIGN][/P][P][/P][P][/P][/td][/tr][tr][td](2)[/td][td](function(){;}())[/td][td][P][/P][P][/P][P][ALIGN=right]4,075,201[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]12,135,960[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]572,694[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]3,025,608[/ALIGN][/P][P][/P][P][/P][/td][/tr][tr][td]void[/td][td]void function(){;}()[/td][td][P][/P][P][/P][P][ALIGN=right]4,030,756[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]12,135,960[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]572,694[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]3,025,608[/ALIGN][/P][P][/P][P][/P][/td][/tr][tr][td]new[/td][td]new function(){;}()[/td][td][P][/P][P][/P][P][ALIGN=right]619,606[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]299,100[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]407,104[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]816,903[/ALIGN][/P][P][/P][P][/P][/td][/tr][tr][td]delete[/td][td]delete function(){;}()[/td][td][P][/P][P][/P][P][ALIGN=right]4,816,225[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]12,135,960[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]572,694[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]2,693,524[/ALIGN][/P][P][/P][P][/P][/td][/tr][tr][td]=[/td][td]var i = function(){;}()[/td][td][P][/P][P][/P][P][ALIGN=right]4,984,774[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]12,135,960[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]565,982[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]2,602,630[/ALIGN][/P][P][/P][P][/P][/td][/tr][tr][td]&&[/td][td]1 && function(){;}()[/td][td][P][/P][P][/P][P][ALIGN=right]5,307,200[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]4,393,486[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]572,694[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]2,565,645[/ALIGN][/P][P][/P][P][/P][/td][/tr][tr][td]||[/td][td]0 || function(){;}()[/td][td][P][/P][P][/P][P][ALIGN=right]5,000,000[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]4,406,035[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]572,694[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]2,490,128[/ALIGN][/P][P][/P][P][/P][/td][/tr][tr][td]&[/td][td]1 & function(){;}()[/td][td][P][/P][P][/P][P][ALIGN=right]4,918,209[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]12,135,960[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]572,694[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]1,705,551[/ALIGN][/P][P][/P][P][/P][/td][/tr][tr][td]|[/td][td]1 | function(){;}()[/td][td][P][/P][P][/P][P][ALIGN=right]4,859,802[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]12,135,960[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]572,694[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]1,612,372[/ALIGN][/P][P][/P][P][/P][/td][/tr][tr][td]^[/td][td]1 ^ function(){;}()[/td][td][P][/P][P][/P][P][ALIGN=right]4,654,916[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]12,135,960[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]572,694[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]1,579,778[/ALIGN][/P][P][/P][P][/P][/td][/tr][tr][td],[/td][td]1, function(){;}()[/td][td][P][/P][P][/P][P][ALIGN=right]4,878,193[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]12,135,960[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]572,694[/ALIGN][/P][P][/P][P][/P][/td][td][P][/P][P][/P][P][ALIGN=right]2,281,186[/ALIGN][/P][P][/P][P][/P][/td][/tr][/TABLE][P][/P][P][/P][P][ALIGN=left][COLOR=rgb(34, 34, 34)][BGCOLOR=rgb(240, 231, 180)][FACE=arial, sans-serif, Verdana]可见不同的方式产生的结果并不相同,而且,差别很大,因浏览器而异。[/COLOR][/BGCOLOR][/FACE][/ALIGN][/P][P][/P][P][/P][P][/P][P][/P][P][ALIGN=left][COLOR=rgb(34, 34, 34)][BGCOLOR=rgb(240, 231, 180)][FACE=arial, sans-serif, Verdana]但我们还是可以从中找出很多共性:[b]new方法永远最慢[/b]——这也是理所当然的。其它方面很多差距其实不大,但有一点可以肯定的是,感叹号并非最为理想的选择。反观[b]传统的括号,在测试里表现始终很快[/b],在大多数情况下比感叹号更快——所以平时我们常用的方式毫无问题,甚至可以说是最优的。[b]加减号在chrome表现惊人[/b],而且在其他浏览器下也普遍很快,相比感叹号效果更好。[/COLOR][/BGCOLOR][/FACE][/ALIGN][/P][P][/P][P][/P][P][/P][P][/P][P][ALIGN=left][COLOR=rgb(34, 34, 34)][BGCOLOR=rgb(240, 231, 180)][FACE=arial, sans-serif, Verdana]当然这只是个简单测试,不能说明问题。但有些结论是有意义的:括号和加减号最优。[/COLOR][/BGCOLOR][/FACE][/ALIGN][/P][P][/P][P][/P][P] 以上都是我的引用,因为在工作时间,所以不能啰嗦。希望大家多多指教[/P][P][/P][P][/P][P][/P]
1楼
顶一下!

电脑版 Page created in 0.0938 seconds with 4 queries.