我们在函数里调用eval的时候,所创建变量的作用域是在当前的作用域下的,比如下面的代码:
<!DOCTYPE HTML>
<html >
<head>
<meta charset="utf-8">
</head>
<script>
(function(){
eval("var a=1")
})()
console.log(a)
</script>
</html>
上面的代码所创建的变量是属于函数作用域的,在函数外面我们使用不了,所以下面说一下几种实现全局eval的方法
1,使用execScript,这个函数在低版本的ie下支持,高版本的已经不支持了,所以涉及兼容性的时候加上他,使用这个函数的时候,加不加window引用都一样,这个和eval(见第三条)不同,这个函数意思应该就是把脚步作为script标签里的脚步执行,所以加不加window都可以。
(function(){
execScript("var a=1")//低版本ie才可以成功执行
})()
console.log(a)
2,使用动态创建的script标签,在全局中执行脚步。(具体实现就是创建一个script标签,然后把需要执行的字符串当做script标签里的脚步就行,然后把新建的script标签增加到head中,执行完后删除就行)
3,使用eval,直接使用eval的时候,浏览器会把当前的作用域作为创建环境,但是我们使用window.eval或者eval.call(window,"str")的时候就可以在全局创建变量了(jquery实现中的代码是window.eval.call(window,"str"),第二个window好像是没有必要的,不知道作者是什么用意)。
(function(){
window.eval("var a=1")//低版本ie才可以成功执行
})()
console.log(a)
4,还有一个不太好的办法就是创建变量的时候不要加var,这样创建的变量是属于全局的,但是对于动态创建函数,我们就没办法了。
(function(){
eval("a=1")//低版本ie才可以成功执行
})()
console.log(a)