javascript使用eval或者new Function進行語法檢查
更新時間:2010年10月16日 00:43:12 作者:
使用代碼來實現(xiàn)分析代碼的語法,這是一件極其痛苦的事情。簡單的解決辦法是:使用腳本引擎自己的語法檢查,比方說eval( ) 或者new Function( )。
使用new Function( ) 來進行語法檢查
eval( ) 方法是不能亂用的,在不適當(dāng)?shù)臅r候使用eval( ) 方法可能導(dǎo)致整個程序都會出問題的;
而new Function( ) 就沒這么大問題。雖然new Function( ) 在任何情況下,構(gòu)造的函數(shù)都是在全局作用域下直接工作的,但只作語法檢查的話,并不會因為作用域問題而產(chǎn)生意外結(jié)果,只要你不直接調(diào)用通過它構(gòu)造的新函數(shù)。
在eval( ) 接受的參數(shù)前面增加“0,”
其實這是由于IE中存在一個bug。出于某種原因,如果你在IE 中想通過調(diào)用eval( ) 來動態(tài)地構(gòu)造一個函數(shù)。
例如:
eval('(function(){ /* code here */ })');
在IE 中得到的返回將是undefined,而其它瀏覽器則會正確地返回這個新構(gòu)造的函數(shù)的引用。
最簡單有效的解決辦法是:在前邊加上“0,”,這樣就能在所有主流瀏覽器中兼容。
例如:
eval('0,function(){ /* code here */ }');
注:在IE9 的Chakra 引擎中,這個問題已經(jīng)解決。
使用數(shù)組對象的concat方法來產(chǎn)生新數(shù)組
把單個對象參數(shù)轉(zhuǎn)化為只包含一個元素的數(shù)組再來處理,可以使用“[ ].concat(o)”的形式。
例如:
var arr1 = [1,2];
var arr2 = [3,4];
var arr3 = arr1.concat(arr2);
alert(arr3.length);
另一種方式是:if (!(o instanceof Array)) o = [o];
// 和ECMAScript 5 中的isArray 相比不夠嚴謹。
網(wǎng)友回復(fù):
1.eval 確實不能亂用;
2.在IE eval 的時候,我的解決方法是在執(zhí)行函數(shù)體內(nèi)return ;
3.Array.prototype.concat.apply([1,2,3],[4,5,6]);
eval( ) 方法是不能亂用的,在不適當(dāng)?shù)臅r候使用eval( ) 方法可能導(dǎo)致整個程序都會出問題的;
而new Function( ) 就沒這么大問題。雖然new Function( ) 在任何情況下,構(gòu)造的函數(shù)都是在全局作用域下直接工作的,但只作語法檢查的話,并不會因為作用域問題而產(chǎn)生意外結(jié)果,只要你不直接調(diào)用通過它構(gòu)造的新函數(shù)。
在eval( ) 接受的參數(shù)前面增加“0,”
其實這是由于IE中存在一個bug。出于某種原因,如果你在IE 中想通過調(diào)用eval( ) 來動態(tài)地構(gòu)造一個函數(shù)。
例如:
eval('(function(){ /* code here */ })');
在IE 中得到的返回將是undefined,而其它瀏覽器則會正確地返回這個新構(gòu)造的函數(shù)的引用。
最簡單有效的解決辦法是:在前邊加上“0,”,這樣就能在所有主流瀏覽器中兼容。
例如:
eval('0,function(){ /* code here */ }');
注:在IE9 的Chakra 引擎中,這個問題已經(jīng)解決。
使用數(shù)組對象的concat方法來產(chǎn)生新數(shù)組
把單個對象參數(shù)轉(zhuǎn)化為只包含一個元素的數(shù)組再來處理,可以使用“[ ].concat(o)”的形式。
例如:
復(fù)制代碼 代碼如下:
var arr1 = [1,2];
var arr2 = [3,4];
var arr3 = arr1.concat(arr2);
alert(arr3.length);
另一種方式是:if (!(o instanceof Array)) o = [o];
// 和ECMAScript 5 中的isArray 相比不夠嚴謹。
網(wǎng)友回復(fù):
1.eval 確實不能亂用;
2.在IE eval 的時候,我的解決方法是在執(zhí)行函數(shù)體內(nèi)return ;
3.Array.prototype.concat.apply([1,2,3],[4,5,6]);
相關(guān)文章
javascript window.open打開新窗口后無法再次打開該窗口問題的解決方法
這篇文章主要介紹了javascript window.open打開新窗口后無法再次打開該窗口問題的解決方法即無法再次打開窗口、第二次打開不了,需要的朋友可以參考下2014-04-04微信小程序利用swiper+css實現(xiàn)購物車商品刪除功能
這篇文章主要介紹了微信小程序利用swiper+css實現(xiàn)購物車商品刪除功能,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03JS中appendChild追加子節(jié)點無效的解決方法
這篇文章主要給大家介紹了關(guān)于JS中appendChild追加子節(jié)點無效的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)2018-10-10Javascript下IE與Firefox下的差異兼容寫法總結(jié)
總結(jié)一部分IE和Firefox的javascript差異寫法,對于像書寫多瀏覽器兼容性更好的代碼,可以參考下。2010-06-06JS實現(xiàn)動態(tài)增加和刪除li標簽行的實例代碼
下面小編就為大家?guī)硪黄狫S實現(xiàn)動態(tài)增加和刪除li標簽行的實例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10javascript實現(xiàn)一個網(wǎng)頁加載進度loading
本篇文章主要介紹了javascript實現(xiàn)一個頁面加載進度loading的具體步驟以及示例代碼,具有一定的參考價值,下面跟著小編一起來看下吧2017-01-01