在Javascript中,eval函数的用法分析
eval()只有一个参数,如果传入的参数不是一个字符串,它返回的参数直接。否则,该字符串将被编译为一个js代码,和语法错误(查询)的例外是如果编译失败抛出。如果编译成功,它开始执行代码并返回在字符串中最后一个表达式或语句的值。如果最后一个表达式或语句有没有价值,它最终将返回未定义。如果抛出一个字符串是一个例外,例外情况将通过调用eval();
eval(),最重要的是,它使用的变量范围的环境来称呼它,即它寻找变量的值和定义新的变量和函数的操作,这是完全相同的局部作用域代码。
eval(var x = 100 );
eval(变量y = 11 );
console.log(X×Y / / x×y = = 1100);
eval(函数foo(x){ return Math.pow(x,x);} );
console.log(foo(5)); / / 25
eval的字符串执行上下文作为调用的函数上下文一样,不使它运行部分的功能:
函数(a){
eval();
};
富(返回;);
上面的代码是全球因为执行eval上下文(一)是全球性的,而回报在全球范围内的使用将抛出一个语法错误:没有返回功能。
eval()已修改局部变量的能力,这是JS优化的一个大问题。为了使JS解释器更简化,这ecmascript3标准规定,任何翻译不允许走样eval()。如果eval()函数调用的别名,一个evalerror会抛出异常。
事实上,大多数的实现都不是这样的。当调用eval()的一个别名,以它的字符串作为顶层的全球性的代码执行代码可以定义新的全局变量和全局函数,或赋值给全局变量,但它不能使用或修改函数的局部变量,所以它不会影响函数中的代码优化。
在ecmascript5,态度是不同的:对evalerror抛出异常。在ecmascript5 eval()函数,当采用非限定名称直接调用,它通常被称为直接eval(直接评价)。当调用eval(),它总是执行的上下文环境。其他间接调用使用全局对象作为上下文的范围,而不能读写和定义局部变量和函数。(但我却发现在Firebug测试所有的全局变量进行了修改:()
现场,需要真正的eval执行的代码段不多,而更多地使用全球评价而不是局部的评价。
旧版的IE9之前即不是全球eval调用eval()时通过别名,但IE定义execscript全局函数()完成全球eval函数(单芯eval()略有不同,和execscript始终返回null)。
严格的ecmascript5模式对eval函数的行为更多的限制。EVAL或eval代码执行的严格模式的使用开始使用的严格命令,eval。eval是严格模式的民营背景将评估作为保留字,这使得eval()更像是一个运营商,没有一个别名(EVAL)函数和变量名、函数名和函数的参数或参数异常可以捕捉命名的评价。
希望本文能对大家的javascript程序设计有所帮助。