相同點:
(1)execScript與eval都可以接收一個字符串,若該字符串是表達式(expression),則執行時將求得該表達式的值並返回;若該字符串是一個或多個語句(statements),則執行時將運行這些語句。
不同點:
(1)execScript是IE瀏覽器獨有;eval則是所有瀏覽器都支持。
(2)execScript無論是在什么作用域(global/local)內被調用,它所接受到的表達式(expression)或語句(statements)字符串都將在全局作用域內執行(global);eval則是在它被調用時所在的作用域內運行它所接受到的表達式(expression)或語句(statements)字符串。
先看看eval例子
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例子
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 }