eval(1 + 2)- > 3。

动态判断源代码中的字符串是一个非常强大的语言功能,它几乎不需要运用到实践中。如果你使用eval(),你应该仔细考虑你是否真的需要使用它。

1。eval()是一个函数或运算符

eval()是一个函数,但由于它一直被视为一个算子。Javascript语言的早期版本定义eval函数,和现代的Javascript解释器执行大量代码的分析和优化,评价问题是用于代码的动态执行通常不能分析,换句话说,如果一个函数调用eval,然后翻译就不可以做这个功能的进一步优化,定义了评价的另一个功能是它可以有其他名称,变量f = eval;然后解释器无法保证任何优化调用f()函数。当eval是一个运算符,你可以避免这些问题。

二,eval()

eval()只有一个参数,如果传入的参数不是一个字符串,它返回的函数直接。如果参数是一个字符串,它将编写一个字符串作为Javascript代码,如果编译失败抛出一个语法错误异常。如果编译成功,它开始执行代码并返回最后一个表达式或语句中的值的字符串。如果最后一个表达式或语句有没有价值,它最终将返回未定义的。如果一个字符串抛出异常,该异常将通过调用eval()。

关于评价,最重要的是,它使用的变量范围环境调用它。也就是说,它看起来对这个变量的值和定义新的变量和函数,以及在局部范围内操作的代码。如果一个函数定义了一个局部变量,然后调用eval(x),它返回局部变量的值。如果它调用eval(x = 1),它改变了局部变量的值。如果函数调用eval(var y = 2),宣布一个新的局部变量Y,同样的,一个函数可以在以下代码中声明一个局部变量。

eval(函数f(){ return x + 1;});

如果你调用eval在最高级别的代码,当然,这会对全局变量和全局函数。

注意,字符串传递给eval必须在语法上会通过,不通过eval函数在任意粘贴代码片段,如:eval(返回;)是没有意义的,因为只有在返回功能发挥作用,而事实上,语境的字符串进行评价和电话的功能是一样的,这使它可以运行作为函数的一部分。如果字符串语义作为一个单独的脚本,这是没有问题的传递给eval作为参数,否则,eval会扔掉语法错误异常。

三。全球eval()

eval()已改变布局变量的能力,这是Javascript优化的一个大问题。然而,作为一种权宜之计,Javascript解释器对函数调用eval小优化。但当脚本定义eval的别名和调用它的另一个名字,多么的Javascript解释器的工作为了使Javascript解析器更简化的实施,ecmascript3标准规定,不允许任何翻译的别名给eval。如果eval函数调用的一个别名,eavlerror抛出异常。

事实上,大多数的实现都是不一样的。当调用通过一个别名,eval执行字符串作为顶层的全球性的代码执行代码可以定义新的全局变量和全局函数,或赋值给全局变量,但它不能使用或修改在主函数中的局部变量。因此,它不影响函数中的代码优化。

ecmascript5反对对eavlerror的使用和规范的行为,一个直接的评价。当我们调用eval()直接使用非限制性评价的名称,它通常被称为直接评价。当eval()是直接调用,它总是执行上下文范围内调用。其他间接调用使用全局对象的上下文范围,不能读,写,和定义的地方变量和函数。下面是一个示例代码示例:

复制代码代码如下所示:
无功geval = eval; / /使用别名叫EVLA全球评估
变量为全局。
功能(F){ / /功能是当地评价实施
本地;定义本地变量。
eval(X =升级;); / /直接使用eval来改变局部变量的值
返回本地变量后返回
}
函数(G){ / /这个功能在全球评估的实施
本地;
Geval(Y =改变;); / /电话直接改变全局变量的值
回到Y;
}
console.log(F)、(x); / /改变布局的变化,局部输出改变了全球
console.log(G),(Y); / /更改全局变量、局部全局改变输出

全球的行为不仅是通过优化代码的妥协方案,但它实际上是一个非常有用的功能,它允许我们执行全局脚本段没有上下文的任何依赖。真正需要eval执行代码段的场景并不多,但当你真正意识到它的必要性,你更可能使用全球评价而不是当地的评价。

四。严格的eval()

严格的ecmascript5模式强加给eval()函数的行为更多的限制,甚至标识符使用eval函数。当eval是严格模式下载,或代码段的开始使用eval执行严格的指令,这里的评价是民营背景,是当地的数值。说,在严格的模式,代码段执行eval可以查询或修改局部变量,但不能在局部作用域定义新的变量或函数。

此外,严格的模式列表评估作为一个保留字,这使得eval()更像是一个操作符,eval()函数不能用别名覆盖。和变量名,函数名,函数或由异常捕获的参数不能被命名为。

四月的雨带来五月的花 u3002