eval和new Function的区别

eval和new Function都可以动态解析和执行字符串。但是它们对解析内容的运行环境判定不同。

     var a = ‘global scope‘
      function b(){
           var a = ‘local scope‘
           eval(‘console.log(a)‘) //local scope
           ;(new Function(‘‘,‘console.log(a)‘))() //global scope
      }
      b()

eval中的代码执行时的作用域为当前作用域。它可以访问到函数中的局部变量。

new Function中的代码执行时的作用域为全局作用域,不论它的在哪个地方调用的。所以它访问的是全局变量a。它根本无法访问b函数内的局部变量。

注意,当我们在b函数中不定义变量a时,两种方法的输出相同。这与上述结论并不冲突。因为代码执行时,对变量的查找是从内到外的。当eval中的代码执行时,它依然是优先从b函数内部查找a变量,当查找不到时,再到全局中查找a,这时找到的a当然是‘global scope‘。

        var a = ‘global scope‘
        function b(){
            //var a = ‘local scope‘
            eval(‘console.log(a)‘) //global scope
            ;(new Function(‘‘,‘console.log(a)‘))() //global scope
        }
        b()    
时间: 2024-11-03 21:23:34

eval和new Function的区别的相关文章

【JavaScript】JS_Object跟Function的区别

JS_Object和Function的区别 我们本次的解释,主要通过下图 粗看该图,估计你不一定能看明白.不过接下来让我逐行向你解释. 最左侧:意思是,有两个对象f1和f2,他们是通过new Foo()出来的. 中间:Foo()就是最左侧用到的Foo() 最右侧:表示,函数Foo()的prototype属性! 1.__proto__的虚线:该条线表示通过f1.__proto__可以访问到Foo.prototype,其实两者是等价的. 2.constructor实现:表示通过Foo.prototy

script脚本中写不写$(document).ready(function() {});的区别

$(document).ready() 里的代码是在页面内容都加载完才执行的,如果把代码直接写到script标签里,当页面加载完这个script标签就会执行里边的代码了,此时如果你标签里执行的代码调用了当前还没加载过来的代码或者dom,那么就会报错,当然如果你把script标签放到页面最后面那么就没问题了,此时和ready效果一样. $(document).ready(function(){})可以简写成$(function(){}); 点击段落后,此段落隐藏: <html> <head

【荐】使用eval()、new Function()将JSON字符串转换为JSON对象

在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 第一种解析方式:使用eval函数来解析,并且使用jQuery的each方法来遍历 用jQuery解析JSON数据的方法,作为jQuery异步请求的传输对象,jQuery请求后返回的结果是json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject等插件封装的JSON对象,与此亦是大同小异,这里不再做说明. 这里首先

【转】onclick事件与href=&#39;javascript:function()&#39;的区别

href='javascript:function()'和onclick能起到同样的效果,一般来说,如果要调用脚本还是在onclick事件里面写代码,而不推荐在href='javascript:function()' 这样的写法,因为 href 属性里面设置了js代码后,在某些浏览器下可能会引发其他不必要的事件.造成非预期效果. 而且 onclick事件会比 href属性先执行,所以会先触发 onclick 然后触发href,所以如果不想页面跳转,可以设置 onclick里面的js代码执行到最后

1、function aa(){}和 var aa=function(){}的区别:

例如: alert(sum(10,10)); function sum(num1,num2){ return num1+num2; }//正常执行 备注:正常执行的那个,在代码开始执行之前,解析器就通过一个名为函数声明提升的过程,读取并将函数声明添加到执行环境中,对代码求值时,javaScript引擎在第一遍会声明函数并将它们放到源代码数的顶部 alert(sum(10,10)); var sum=function(num1,num2){ return num1+num2; }//报错 1.fu

【jQuery 区别】.click()和$(document).on(&quot;click&quot;,&quot;指定的元素&quot;,function(){});的区别

给出以下的代码展示: 1 //绑定 下一页 的点击事件 2 $("a[aria-label='Next']").click(function(){ 3 $("a[aria-label='Previous']").show(); 4 if(page.pageNo == page.totalPage - 1){ 5 $("a[aria-label='Next']").hide(); 6 }else{ 7 $("a[aria-label='N

关于eval 与new Function 到底该选哪个?

废话不多说,直接上测试代码 复制代码 代码如下: var aa = "{name:'cola',item:[{age:11},{age:22},{age:23},{age:23}]}";     var now = new Date().getTime();     for (var i = 0; i < 100000; i++) {         var a = eval("(" + aa + ")"); }     var now1

IE 当eval遇上function的处理

IE 当eval遇上function的处理 本文标签:eval function 情况1:eval里没有function,直接执行: eval("alert(ss);");//所有浏览器正确均输出 情况2:eval里有function,function立即执行: eval("(function(){alert(ss);})();");//所有浏览器正确输出 情况3:eval里有function,使用变量保存function引用并调用该function: var f=

js立即执行函数: (function ( ){...})( ) 与 (function ( ){...}( )) 有区别?

没有区别. 你需要明白 IIFE 的原理,我简单说一下: function foo() {...} // 这是定义,Declaration:定义只是让解释器知道其存在,但是不会运行. foo(); // 这是语句,Statement:解释器遇到语句是会运行它的. IIFE 并非必须,传统一点可以这么写: function foo() {...} foo(); 那么为什么要 IIFE? 传统的方法啰嗦,定义和执行分开写: 传统的方法直接污染全局命名空间(浏览器里的 global 对象,如 wind