当前位置: 首页 > 编程笔记 >

javascript中eval函数用法分析

澹台鸿熙
2023-03-14
本文向大家介绍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程序设计有所帮助。

 类似资料:
  • 本文向大家介绍JavaScript数组、json对象、eval()函数用法实例分析,包括了JavaScript数组、json对象、eval()函数用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript数组、json对象、eval()函数用法。分享给大家供大家参考,具体如下: 一、JavaScript中的数组 数组使用[]、new Array()或new Array

  • eval函数与文本变量一起实现有力的文本宏工具。语句 eval(s) 用MATLAB的注释器求表达式的值或执行包含于文本字符串s的语句。 前一节的例子也可以在下面的代码中实现,虽然这有点低效率因为它用到完全注释器,而不只是函数调用。 for d = 1:31 s = ['load August' int2str(d) '.dat']; eval(s) % Process t

  • 本文向大家介绍JavaScript匿名函数用法分析,包括了JavaScript匿名函数用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript匿名函数用法。分享给大家供大家参考。具体如下: 一、定义一个函数 在JavaScript中,可以通过“函数声明”和“函数表达式”来定义一个函数,比如 1、通过“函数声明”来定义一个函数 2、通过“函数表达式”来定义一个函数 但是两

  • 本文向大家介绍Eval函数的作用相关面试题,主要包含被问及Eval函数的作用时的应答技巧和注意事项,需要的朋友参考一下 eval可以将字符串生成语句执行,一般执行动态的js语句。 eval的使用场合:有时候我们预先不知道要执行什么语句,只有当条件和参数给时才知道执行什么语句,这时候eval就派上用场了。

  • Python 内置函数 描述 eval() 函数用来执行一个字符串表达式,并返回表达式的值。 语法 以下是 eval() 方法的语法: eval(expression[, globals[, locals]]) 参数 expression -- 表达式。 globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。 locals -- 变量作用域,局部命名空间,如果被提供

  • 本文向大家介绍javascript中parseInt()函数的定义和用法分析,包括了javascript中parseInt()函数的定义和用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了javascript中parseInt()函数的定义和用法。分享给大家供大家参考。具体分析如下: 此函数可以解析一个字符串,并返回一个整数。 语法结构: 参数列表: 参数 描述 string 必需。

  • 问题内容: 我有一个类似以下的字符串: 现在,我必须20使用字符串来获取结果。 我知道其他一些语言的功能可以做到这一点。如何用Java做到这一点? 问题答案: 您可以使用该类并将其评估为Javascript字符串。 也许有更好的方法,但这是可行的。

  • 问题内容: 我有一个类似以下的字符串: 现在,我必须20使用字符串来获取结果。 我知道其他一些语言的功能可以做到这一点。如何用Java做到这一点? 问题答案: 你可以使用ScriptEngine该类并将其评估为Javascript字符串。 也许有更好的方法,但这是可行的。