eval與window.eval的差異

evalwindow.eval的差異

它們之間有區別嗎?json

開發過程當中彷佛不多有人去加個額外的window,以爲畫蛇添足。好比Ajax過程當中回調函數解析JSON格式字符串瀏覽器

1 ...
2 function callback(str){
3     var json = eval('(' + str + ')');
4 }
5 ...

但因爲各個引擎實現差別,它們的區別仍是有的。一般直接使用eval,而非var json = window.eval('(' + str + ')');
又好比調試時使用alert,不多有人使用window.alertIE中獲取事件對象使用event,不多有人使用window.event。(Firefox中在某些狀況下也支持event而不支持window.event閉包

 1 var x = 5;
 2 
 3 function fn(){
 4 
 5     var x = 'jack';
 6 
 7     eval('x=10;');
 8 
 9 }
10 
11 fn();
12 
13 alert(x); // -->5

修改下,把以上代碼的eval換成window.eval,測試後發現各個瀏覽器中的表現不同了。全部瀏覽器中輸出的都是5,說明調用fneval修改的是fn內的局部變量x,而非全局的x。即eval執行的閉包環境是在fn內。函數


IE6/7/8 : 仍然輸出5,即沒有修改全局變量x,修改的仍然是局部變量x
IE9/Firefox/Safari/Chrome/Opera : 輸出10,修改的是全局變量x

能夠得出結論了
IE6/7/8中,evalwindow.eval同樣,寫在自定義函數內是局部閉包,不然是全局閉包。
IE9/Firefox/Safari/Chrome/Opera中,eval同以上IE6/7/8window.eval即便寫在自定義函數內使用的也是全局閉包。測試

相關文章
相關標籤/搜索