亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript小技巧 2.5 則

 更新時(shí)間:2010年09月12日 19:14:09   作者:  
在上一篇文章中的(偽)Lambda模塊中使用了幾個(gè)小技巧,現(xiàn)在我就把這幾個(gè)小技巧介紹一下
在前一篇博文中我介紹了一種可以讓JavaScript多少具備一點(diǎn)類似Lambda表達(dá)式的編程能力的辦法,但是由于要兼容于JavaScript的語法檢查,所以可以使用的場(chǎng)合也很有限。

不過有些比較細(xì)心的朋友可能發(fā)現(xiàn)了,我在那個(gè)(偽)Lambda模塊中使用了幾個(gè)小技巧,現(xiàn)在我就把這幾個(gè)小技巧介紹一下:

1、使用new Function來進(jìn)行語法檢查。

嘗試寫框架的同學(xué)們一定對(duì)此感受頗深:有的時(shí)候通過代碼產(chǎn)生的代碼可能因?yàn)榧夹g(shù)上的失誤而產(chǎn)語法錯(cuò)誤,導(dǎo)致運(yùn)行過程中異常中斷;有的時(shí)候需要接受用戶的輸入,但用戶可能有意或者無意地寫入有誤的語句或表達(dá)式。
有些同學(xué)為了解決這種問題特意去編寫(或者使用現(xiàn)成的)復(fù)雜的語法檢查過程——但編寫用來分析代碼語法的代碼是一件極其痛苦的事情,一旦發(fā)現(xiàn)問題調(diào)整起來也非常不方便。
其實(shí)這個(gè)問題有簡(jiǎn)單一點(diǎn)的解決辦法,就是使用腳本引擎自己的語法檢查,比方說eval或者new Function——當(dāng)然這個(gè)eval是不能亂用的,在不適當(dāng)?shù)臅r(shí)候用了eval的話整個(gè)程序都會(huì)出問題的;而new Function就沒這么大問題——雖然說new Function在任何情況下構(gòu)造的函數(shù)都是在全局作用域下直接工作的,但只是語法檢查的話并不會(huì)因?yàn)樽饔糜騿栴}而產(chǎn)生意外結(jié)果,只要你不真的直接調(diào)用通過它構(gòu)造的新函數(shù)。

2、在eval接受的參數(shù)前面增加“0,”。

其實(shí)這是由于IE中存在一個(gè)BUG。

出于某種神奇的原因,如果你在IE中想通過調(diào)用eval來動(dòng)態(tài)地構(gòu)造一個(gè)函數(shù)的話,如果只是在函數(shù)的表達(dá)式兩邊增加括號(hào)——例如:
復(fù)制代碼 代碼如下:

eval('(function(){ /* code here */ })');


得到的返回也仍然是undefined,而其它瀏覽器則會(huì)正確地返回這個(gè)新構(gòu)造的函數(shù)的引用。
經(jīng)過小小的探索之后,我發(fā)現(xiàn)最簡(jiǎn)單有效的解決問題的辦法就是在前邊加上“0,” ,這樣就在所有(或者說,至少是現(xiàn)在的五大主流)瀏覽器中都能得到預(yù)期結(jié)果了。
復(fù)制代碼 代碼如下:

eval('0,function(){ /* code here */ }');

注:在IE9的Chakra引擎中這個(gè)問題已經(jīng)解決了~

3、使用數(shù)組對(duì)象的concat方法來產(chǎn)生新數(shù)組。

認(rèn)真的說這個(gè)應(yīng)該屬于JavaScript的常識(shí),畢竟這個(gè)方法的用法在任何一個(gè)JavaScript語言功能參考上都能找到。
但是可能有些同學(xué)總是想不起來什么時(shí)候可以用它。
在我的(偽) Lambda模塊中,我很無聊地編寫了一個(gè)可以把一個(gè)引用/值以多種別名同時(shí)附加在多個(gè)對(duì)象上的函數(shù),這個(gè)函數(shù)既可以接受一個(gè)對(duì)象作為參數(shù),也可以接受包含一系列對(duì)象的數(shù)組作為參數(shù)。
由于這個(gè)函數(shù)被調(diào)用的次數(shù)比較少,所以我決定用(不一定效率最好,但)簡(jiǎn)單有效的辦法來適應(yīng)兩種情況,也就是把單個(gè)對(duì)象參數(shù)轉(zhuǎn)化為只包含一個(gè)元素的數(shù)組再來處理,我選擇了用“[].concat(o)”的形式。
如果你有閱讀我的代碼,你可能會(huì)發(fā)現(xiàn)注釋中還包含了另一種方式,也就是“if (!(o instanceof Array)) o = [o]” ——后來我想了想,覺得一來不夠嚴(yán)謹(jǐn)(和ECMAScript 5中的isArray相比),二來調(diào)用的次數(shù)比較少,性能提升也很有限,就選擇了前一種。
在閱讀本文的同學(xué)們,你們有沒有什么有趣的技巧可以分享給大家呢?

相關(guān)文章

最新評(píng)論