javascript中eval函数用法分析

 更新时间:2015年04月25日 12:15:57   作者:大熊猫侯佩  
这篇文章主要介绍了javascript中eval函数用法,实例分析了javascript中eval函数的使用技巧,非常具有实用价值,需要的朋友可以参考下

本文实例分析了javascript中eval函数用法。分享给大家供大家参考。具体分析如下:

eval()只有一个参数,如果传入的参数不是字符串,则直接返回这个参数。否则会将字符串当成js代码进行编译,如果编译失败则抛出语法错误(SyntaxError)异常。如果编译成功则开始执行这段代码,并返回字符串中的最后一个表达式或语句的值;如果最后一个表达式或语句没有值,则最终返回undefined。如果字符串抛出异常,则该异常将把该调用传递给eval();

eval()最为重要的是,它使用了调用它的变量作用域环境,即它查找变量的值和定义新变量和函数的操作和局部作用域的代码完全一样。

eval("var x = 100");
eval("var y = 11");
console.log(x * y); //x * y == 1100
eval("function foo(x){return Math.pow(x,x);}");
console.log(foo(5)); // 25

eval字符串执行时的上下文环境和调用函数的上下文环境是一样的,这不能使其作为函数的一部分来运行:

var foo = function(a){
  eval(a);
  };
foo("return;");

以上代码因为执行eval(a)的上下文是全局的,在全局上下文中使用return会抛出语法错误:return not in function.

eval()具有修改局部变量的能力,这对于js优化器来说是一个很大的问题。为了让js解释器实现更加简化,ECMAScript3标准规定了任何解释器都不允许对eval()赋予别名,如果eval()函数通过别名调用会抛出一个EvalError异常。
实际上大多数的实现不是这样的。当通过别名调用时,eval()会将其字符串当成顶层的全局代码来执行。执行代码可能会定义新的全局变量和全局函数,或给全局变量赋值,但却不能使用或修改主调用函数中的局部变量,因此不会影响到函数内部的代码优化。

而在ECMAScript5中,态度有所不同:反对抛出EvalError异常。在ECMAScript5中当直接使用非限定名来调用eval()函数时,通常称为”直接eval(direct eval)”;直接调用eval()时,总是在调用它的上下文作用域内执行。而其他的间接调用则使用全局对象作为其上下文作用域,且无法读写和定义局部变量和函数。(但实际我在firebug测试里发现,都是修改了全局变量 :( )

需要真正eval来执行代码段的场景并不多见,可能更多的会使用全局eval而不是局部eval。

IE9之前的早期版本IE当通过别名调用eval()时并不是全局eval,但IE定义了一个execScript()的全局函数来完成全局eval的功能(单核eval()稍有不同,execScript()总是返回null)。

ECMAScript5严格模式对eval函数行为施加了更多的限制。在严格模式下使用eval或eval执行代码以”use strict”指令开始时,eval是私有上下文环境中的局部eval.此外严格模式将eval列为保留字,这让eval()更像一个运算符,不能用一个别名覆盖eval()函数,并且变量名、函数名、函数参数或者异常捕获的参数都不能取名为”eval”.

希望本文所述对大家的javascript程序设计有所帮助。

相关文章

  • js验证是否为数字的总结

    js验证是否为数字的总结

    js验证是否为数字的总结,需要的朋友可以参考一下
    2013-04-04
  • JS实现淘宝支付宝网站的控制台菜单效果

    JS实现淘宝支付宝网站的控制台菜单效果

    这篇文章主要介绍了JS实现淘宝支付宝网站的控制台菜单效果,涉及JavaScript基于时间函数及数学运算控制页面动画弹出菜单效果的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • JavaScript面向对象之体会[总结]

    JavaScript面向对象之体会[总结]

    看过很多JavaScript书,对JavaScript的面向对象讲的都比较深入,但是并没有做到深入浅出,总结了我做的一些JavaScript程序的经验,以简洁明了的文字使大家明白JavaScript面向对象的实现。
    2008-11-11
  • JavaScript实现通过键盘弹钢琴的效果实例代码

    JavaScript实现通过键盘弹钢琴的效果实例代码

    这篇文章主要给大家介绍了关于JavaScript实现通过键盘弹钢琴效果的相关资料,通过JS代码实现了钢琴键盘的交互效果,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • IScroll那些事_当内容不足时下拉刷新的解决方法

    IScroll那些事_当内容不足时下拉刷新的解决方法

    下面小编就为大家带来一篇IScroll那些事_当内容不足时下拉刷新的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • window.open()详解及浏览器兼容性问题示例探讨

    window.open()详解及浏览器兼容性问题示例探讨

    这篇文章主要介绍了window.open()的使用及浏览器兼容性问题方面的知识,感兴趣的朋友可以参考下
    2014-05-05
  • js jquery数组介绍

    js jquery数组介绍

    js jquery数组介绍,数组时编程中比较常用的处理,需要的朋友可以参考下
    2012-07-07
  • 小程序怎样让wx.navigateBack更好用的方法实现

    小程序怎样让wx.navigateBack更好用的方法实现

    这篇文章主要介绍了小程序怎样让wx.navigateBack更好用的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • js仿淘宝评价评分功能

    js仿淘宝评价评分功能

    本文主要介绍了js仿淘宝评价评分功能——点击心形生成得分(有半心选择),具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • 基于element-ui 动态换肤的代码详解

    基于element-ui 动态换肤的代码详解

    这篇文章主要介绍了element-ui 动态换肤,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03

最新评论