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)——例如:
eval('(function(){ /* code here */ })');
得到的返回也仍然是undefined,而其它瀏覽器則會(huì)正確地返回這個(gè)新構(gòu)造的函數(shù)的引用。
經(jīng)過小小的探索之后,我發(fā)現(xiàn)最簡(jiǎn)單有效的解決問題的辦法就是在前邊加上“0,” ,這樣就在所有(或者說,至少是現(xiàn)在的五大主流)瀏覽器中都能得到預(yù)期結(jié)果了。
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é)們,你們有沒有什么有趣的技巧可以分享給大家呢?
不過有些比較細(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é)們,你們有沒有什么有趣的技巧可以分享給大家呢?
您可能感興趣的文章:
- JavaScript小技巧整理篇(非常全)
- JavaScript小技巧整理
- 谷歌瀏覽器調(diào)試JavaScript小技巧
- Javascript小技巧之生成html元素
- javascript小技巧 超強(qiáng)推薦
- JavaScript編程的10個(gè)實(shí)用小技巧
- JavaScript初學(xué)者需要了解10個(gè)小技巧
- JavaScript編程開發(fā)中的五個(gè)實(shí)用小技巧
- JavaScript 學(xué)習(xí)筆記一些小技巧
- javascript兩段代碼,兩個(gè)小技巧
- Javascript 小技巧全集
- 分享12個(gè)非常實(shí)用的JavaScript小技巧
相關(guān)文章
JavaScript操作select元素和option的實(shí)例代碼
這篇文章主要介紹了JavaScript操作select元素和option的實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-01-01JavaScript面向?qū)ο缶幊虒?shí)現(xiàn)模擬
面向?qū)ο缶幊?Object Oriented Programming)將現(xiàn)實(shí)世界中的復(fù)雜關(guān)系抽象成一個(gè)個(gè)對(duì)象,通過對(duì)象之間的分工合作對(duì)現(xiàn)實(shí)世界進(jìn)行模擬2022-10-10createTextRange()的使用示例含文本框選中部分文字內(nèi)容
這篇文章主要介紹了createTextRange()的使用示例,需要的朋友可以參考下2014-02-02微信小程序事件 bindtap bindinput代碼實(shí)例
這篇文章主要介紹了微信小程序事件 bindtap bindinput代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08js中異步函數(shù)async function變同步函數(shù)的簡(jiǎn)單入門
這篇文章主要介紹了js中異步函數(shù)async function變同步函數(shù)的簡(jiǎn)單入門,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04JavaScript實(shí)現(xiàn)網(wǎng)頁五子棋小游戲
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)網(wǎng)頁五子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06