详细分析execScript与eval异同。
- 相同点
- execScript与eval接收一个字符串,若是表达式expression,则执行时求得该表达式的值并返回;若是一个或多个语句statements,则执行时运行这些语句。
- 不同点
- execScript是IE浏览器独有;eval则是所有浏览器都支持。
- 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 }