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 }
相关文章
相关标签/搜索