execScript與eval區別

相同點:express

(1)execScript與eval均可以接收一個字符串,若該字符串是表達式(expression),則執行時將求得該表達式的值並返回;若該字符串是一個或多個語句(statements),則執行時將運行這些語句。瀏覽器

不一樣點:函數

(1)execScript是IE瀏覽器獨有;eval則是全部瀏覽器都支持。spa

(2)execScript不管是在什麼做用域(global/local)內被調用,它所接受到的表達式(expression)或語句(statements)字符串都將在全局做用域內執行(global);eval則是在它被調用時所在的做用域內運行它所接受到的表達式(expression)或語句(statements)字符串。code

先看看eval例子blog

1 eval('var global = "global";');//全局做用域內調用eval,則var global = "global";是在全局做用域內被運行的,最終是獲得一個global全局變量
2 (function(){
3   //這個匿名函數塊內生成了一個局部做用域
4   eval('var local = "local";');//局部做用域內調用eval,則var local = "local";是在局部做用域內被運行的,最終是獲得一個local局部變量
5   console.log(local);//輸出local
6   console.log(global);//輸出global,由於它是全局變量
7 })();
8 console.log(global);//輸出global
9 console.log(local);//報錯,提示local爲聲明,由於local是局部變量,外部沒法訪問

再看看execScript例子ip

 1 //注意,如下代碼必須在IE瀏覽器下運行
 2 execScript('var global = "global";');//這裏聲明並初始化了一個global全局變量
 3 (function(){
 4     //這個匿名函數塊內生成了一個局部做用域
 5     execScript('var local = "local";');//這裏其實仍是聲明並初始化了一個local的全局變量,不要誤認爲local是一個局部變量哦。
 6     alert(local);//輸出local
 7     alert(global);//輸出global
 8 })();
 9 alert(local);//輸出local
10 alert(global);//輸出global

那麼如何在不支持execScript函數的瀏覽器下實如今全局做用內執行字符串呢?這裏列出jQuery的實現,其實仍是蠻簡單的,具體以下:作用域

 1  function globalEval( data ) {
 2     if ( data ) {
 3       // We use execScript on Internet Explorer
 4       // We use an anonymous function so that context is window
 5       // rather than jQuery in Firefox
 6       ( window.execScript || function( data ) {
 7           window[ "eval" ].call( window, data );
 8       } )( data );
 9     }
10 }
相關文章
相關標籤/搜索