相同點: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 }