Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Revision 1122477 of eval()

  • Revision slug: Web/JavaScript/Reference/Global_Objects/eval
  • Revision title: eval()
  • Revision id: 1122477
  • Created:
  • Creator: jasonnian1978
  • Is current revision? No
  • Comment
Tags: 

Revision Content

{{jsSidebar(“对象”)}}

eval()函数计算以字符串形式表示的JavaScript代码。

句法

eval(string)

参数

string
代表一个JavaScript表达式,语句或语句序列的字符串。表达式可以包括变量和现有对象的特性。

返回值

评估代表给定的代码完成值的字符串。如果完成值为空,{{jsxref(“未定义”)}}被返回。

描述

eval() 是全局对象的功能属性。

该的参数eval()函数是一个字符串。如果字符串表示表达式,eval()计算表达式。如果该参数代表一个或多个JavaScript语句,eval() 评估声明。不要打电话eval()来评估一个算术表达式; JavaScript的自动计算算术表达式。

如果你构建一个算术表达式作为一个字符串,就可以使用eval()在以后的时间来评估它。例如,假设你有一个变量x您可以推迟涉及表达式的评价x通过分配表达式的字符串值,说“ 3 * x + 2”,给一个变量,然后调用eval()在脚本稍后。

如果参数eval()不是字符串,eval()返回参数不变。在下面的例子中,String构造被指定,并eval()返回一个String对象,而不是评估串。

的eval(新的String(“2 + 2”)); //返回包含“2 + 2”的String对象
的eval(“2 + 2”); //返回4

您可以通过使用解决此限制在一个通用的方式toString()

VAR表达式=新的String(“2 + 2”);
的eval(expression.toString());

如果您使用的eval函数间接地经由以外的引用调用它eval,  为的ECMAScript 5的它工作在全局范围内,而不是本地范围; 这意味着,例如,该函数声明创建全局函数,并且该码被评估没有访问到它被称为的范围内的局部变量。

功能测试(){
  变种X = 2,Y = 4;
  的console.log(的eval(“X + Y”)); //直接调用,使用本地范围,结果是6
  VAR geval = EVAL;
  的console.log(geval(“X + Y”)); //间接调用,采用全球范围内,引发ReferenceError因为`x`未定义
}

不要使用eval不必要的!

eval()是一种危险的功能,它执行它与呼叫者的权限传递的代码。如果运行eval()与可能是由恶意方受到影响的字符串,你可能最终运行用户计算机上的恶意代码网页/展期的权限。更重要的是,第三方代码可以看到其中的范围eval()被调用,这可以导致在办法其中类似{{jsxref(“Global_Objects /功能”,“功能”)}}不易可能的攻击。

eval() 一般也比其它慢,因为它必须调用JS解释,而许多其他构建体是由现代JS引擎优化。

有更安全(更快!)替代eval()常见的用例。

访问成员属性

你不应该使用eval()对属性名称转换为属性。考虑下面的例子,其中要访问的对象的属性,直到执行代码是未知的。这可以用的eval来完成:

VAR OBJ = {A:20,B:30};
VAR PROPNAME = getPropName(); //返回“a”或“b”的

的eval(“VAR结果=目标文件”+ PROPNAME);

然而,eval()没有必要在这里。事实上,这里不鼓励使用。相反,使用属性访问,这是更快,更安全:

VAR OBJ = {A:20,B:30};
VAR PROPNAME = getPropName(); //返回“a”或“b”的
VAR的结果= OBJ [PROPNAME] //物镜[“一个”]是相同的obj.a

使用函数而不是评估的代码片段

JavaScript有一流的功能,这意味着你可以函数作为参数传递给其他的API,将它们存储在变量和对象的属性,等等。很多的DOM API在设计时考虑到这一点,所以你可以(也应该)写:

//代替的setTimeout(“...”,1000)使用方法:
的setTimeout(函数(){...},1000); 

//而不是elt.setAttribute(“onclick”事件,“...”)使用:
elt.addEventListener(“点击”,函数(){...},FALSE); 

闭包也作为一种方式来创建参数化功能,而无需连接字符串很有帮助。

JSON解析(字符串转换为JavaScript对象)

如果你调用该字符串eval()的包含数据(例如,一个数组:"[1, 2, 3]"),而不是代码,你应该考虑切换到JSON,这使得该字符串使用JavaScript语法的子集来表示数据。又见下载JSON和JavaScript扩展

请注意,由于JSON语法是比较JavaScript语法的限制,许多有效的JavaScript文字不会解析为JSON。例如,尾随逗号没有在JSON允许的,并在对象文本属性名称(键)必须用引号括起来。一定要使用一个JSON序列生成稍后将解析为JSON字符串。

通过数据,而不是代码

例如,设计凑的网页的网页内容的扩展可能在定义的规则,刮的XPath,而不是JavaScript代码。

在有限的权限运行代码

如果你必须运行代码,可以考虑降低权限运行它。这个建议主要适用于扩展和XUL应用程序,它可以使用Components.utils.evalInSandbox这一点。

例子

运用 eval

在下面的代码,既包含语句eval()返回42.第一个计算字符串“ x + y + 1”; 第二个计算字符串“ 42”。

变种X = 2;
变种Y = 39;
VAR Z =“42”;
的eval(“X + Y + 1”); //返回42
的eval(Z); //返回42

使用eval评估JavaScript语句的字符串

下面的示例使用eval()来评估串str该字符串由打开一个警告对话框,指定JavaScript语句z如果值为42 x是五,并分配0 z,否则。当执行第二条语句,eval()将导致执行这些语句中,并且它也将评估一组语句,并返回分配给的值z

VAR X = 5;
无功海峡=“如果(X == 5){执行console.log('z是42'); Z = 42;}否则Z = 0;”;

的console.log(“z是”的eval(STR));

最后表达式求值

eval() 返回最后计算的表达式的值。

无功海峡=“如果(一){1 + 1;}其他{1 + 2;}”;
VAR一个= TRUE;
变种B =的eval(STR); //返回2
 
的console.log(“b为:”+ B);

A = FALSE;
B =的eval(STR); //返回3

的console.log(“b为:”+ B);

eval 作为定义函数字符串要求“(”和“)”作为前缀与后缀

变种fctStr1 =“函数a(){}”
变种fctStr2 =“(函数a(){})”
VAR fct1 =的eval(fctStr1)//返回未定义
VAR fct2 =的eval(fctStr2)//返回一个函数

产品规格

规范 状态 评论
{{SpecName('ES1')}} {{Spec2('ES1')}} 初始定义。
{{SpecName('ES5.1','#仲丁基15.1.2.1','的eval')}} {{Spec2('ES5.1')}}  
{{SpecName('ES6','#仲的eval-X','的eval')}} {{Spec2('ES6')}}  
{{SpecName('ESDraft','#仲的eval-X','的eval')}} {{Spec2('ESDraft')}}  

浏览器兼容性

{{CompatibilityTable}}

特征 火狐(壁虎) IE浏览器 歌剧 苹果浏览器
基本支持 {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}}
特征 Android版 Android版Chrome Firefox移动(壁虎) IE浏览器移动 Opera移动 移动Safari浏览器
基本支持 {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}}

Gecko的具体注意事项

  • 历史上eval()有一个任选的第二个参数,指定一个对象在其上下文中评价为要执行。这种说法是不规范的,并且从SpiderMonkey的壁虎在1.9.1(火狐3.5)被删除。见{{错误(442333)}}。

也可以看看

  • {{jsxref(“Global_Objects / uneval”,“uneval()”)}}
  • 属性访问器

Revision Source

<div><font><font>{{jsSidebar(“对象”)}}</font></font></div>

<p><font><font>该</font></font><code><strong>eval()</strong></code><font><font>函数计算以字符串形式表示的JavaScript代码。</font></font></p>

<h2 id="Syntax"><font><font>句法</font></font></h2>

<pre class="syntaxbox">
<code>eval(<em>string</em>)</code></pre>

<h3 id="Parameters"><font><font>参数</font></font></h3>

<dl>
 <dt><code>string</code></dt>
 <dd><font><font>代表一个JavaScript表达式,语句或语句序列的字符串。</font><font>表达式可以包括变量和现有对象的特性。</font></font></dd>
</dl>

<h3 id="Return_value"><font><font>返回值</font></font></h3>

<p><font><font>评估代表给定的代码完成值的字符串。</font><font>如果完成值为空,{{jsxref(“未定义”)}}被返回。</font></font></p>

<h2 id="Description"><font><font>描述</font></font></h2>

<p><code>eval()</code><font><font> 是全局对象的功能属性。</font></font></p>

<p><font><font>该的参数</font></font><code>eval()</code><font><font>函数是一个字符串。</font><font>如果字符串表示表达式,</font></font><code>eval()</code><font><font>计算表达式。</font><font>如果该参数代表一个或多个JavaScript语句,</font></font><code>eval()</code><font><font>&nbsp;评估声明。</font><font>不要打电话</font></font><code>eval()</code><font><font>来评估一个算术表达式; </font><font>JavaScript的自动计算算术表达式。</font></font></p>

<p><font><font>如果你构建一个算术表达式作为一个字符串,就可以使用</font></font><code>eval()</code><font><font>在以后的时间来评估它。</font><font>例如,假设你有一个变量</font></font><code>x</code><font><font>。</font><font>您可以推迟涉及表达式的评价</font></font><code>x</code><font><font>通过分配表达式的字符串值,说“ </font></font><code>3 * x + 2</code><font><font>”,给一个变量,然后调用</font></font><code>eval()</code><font><font>在脚本稍后。</font></font></p>

<p><font><font>如果参数</font></font><code>eval()</code><font><font>不是字符串,</font></font><code>eval()</code><font><font>返回参数不变。</font><font>在下面的例子中,</font></font><code>String</code><font><font>构造被指定,并</font></font><code>eval()</code><font><font>返回一个</font></font><code>String</code><font><font>对象,而不是评估串。</font></font></p>

<pre class="brush:js">
<font><font>的eval(新的String(“2 + 2”)); </font><font>//返回包含“2 + 2”的String对象</font></font><font><font>
的eval(“2 + 2”); </font><font>//返回4</font></font>
</pre>

<p><font><font>您可以通过使用解决此限制在一个通用的方式</font></font><code>toString()</code><font><font>。</font></font></p>

<pre class="brush:js">
<font><font>VAR表达式=新的String(“2 + 2”);</font></font><font><font>
的eval(expression.toString());</font></font>
</pre>

<p><font><font>如果您使用的</font></font><code>eval</code><font><font>函数</font></font><em><font><font>间接地</font></font></em><font><font>经由以外的引用调用它</font></font><code>eval</code><font><font>,&nbsp; </font></font><a href="https://www.ecma-international.org/ecma-262/5.1/#sec-10.4.2"><font><font>为的ECMAScript 5的</font></font></a><font><font>它工作在全局范围内,而不是本地范围; </font><font>这意味着,例如,该函数声明创建全局函数,并且该码被评估没有访问到它被称为的范围内的局部变量。</font></font></p>

<pre class="brush:js">
<font><font>功能测试(){</font></font><font><font>
  变种X = 2,Y = 4;</font></font><font><font>
  的console.log(的eval(“X + Y”)); </font><font>//直接调用,使用本地范围,结果是6</font></font><font><font>
  VAR geval = EVAL;</font></font><font><font>
  的console.log(geval(“X + Y”)); </font><font>//间接调用,采用全球范围内,引发ReferenceError因为`x`未定义</font></font><font><font>
}</font></font>
</pre>

<h2 id="Don't_use_eval_needlessly!"><font><font>不要使用</font></font><code>eval</code><font><font>不必要的!</font></font></h2>

<p><code>eval()</code><font><font>是一种危险的功能,它执行它与呼叫者的权限传递的代码。</font><font>如果运行</font></font><code>eval()</code><font><font>与可能是由恶意方受到影响的字符串,你可能最终运行用户计算机上的恶意代码网页/展期的权限。</font><font>更重要的是,第三方代码可以看到其中的范围</font></font><code>eval()</code><font><font>被调用,这可以导致在办法其中类似{{jsxref(“Global_Objects /功能”,“功能”)}}不易可能的攻击。</font></font></p>

<p><code>eval()</code><font><font> 一般也比其它慢,因为它必须调用JS解释,而许多其他构建体是由现代JS引擎优化。</font></font></p>

<p><font><font>有更安全(更快!)替代</font></font><code>eval()</code><font><font>常见的用例。</font></font></p>

<h3 id="Accessing_member_properties"><font><font>访问成员属性</font></font></h3>

<p><font><font>你不应该使用</font></font><code>eval()</code><font><font>对属性名称转换为属性。</font><font>考虑下面的例子,其中要访问的对象的属性,直到执行代码是未知的。</font><font>这可以用的eval来完成:</font></font></p>

<pre class="brush:js">
<font><font>VAR OBJ = {A:20,B:30};</font></font><font><font>
VAR PROPNAME = getPropName(); </font><font>//返回“a”或“b”的</font></font>
<font><font>
的eval(“VAR结果=目标文件”+ PROPNAME);</font></font>
</pre>

<p><font><font>然而,</font></font><code>eval()</code><font><font>没有必要在这里。</font><font>事实上,这里不鼓励使用。</font><font>相反,使用</font></font><a href="/en-US/docs/Web/JavaScript/Reference/Operators/Property_Accessors" title="的JavaScript /参考/运营/ Member_Operators"><font><font>属性访问</font></font></a><font><font>,这是更快,更安全:</font></font></p>

<pre class="brush:js">
<font><font>VAR OBJ = {A:20,B:30};</font></font><font><font>
VAR PROPNAME = getPropName(); </font><font>//返回“a”或“b”的</font></font><font><font>
VAR的结果= OBJ [PROPNAME] </font><font>//物镜[“一个”]是相同的obj.a</font></font>
</pre>

<h3 id="Use_functions_instead_of_evaluating_snippets_of_code"><font><font>使用函数而不是评估的代码片段</font></font></h3>

<p><font><font>JavaScript有</font></font><a class="external" href="https://en.wikipedia.org/wiki/First-class_function" title="https://en.wikipedia.org/wiki/First-class_function"><font><font>一流的功能</font></font></a><font><font>,这意味着你可以函数作为参数传递给其他的API,将它们存储在变量和对象的属性,等等。</font><font>很多的DOM API在设计时考虑到这一点,所以你可以(也应该)写:</font></font></p>

<pre class="brush: js">
<font><font>//代替的setTimeout(“...”,1000)使用方法:</font></font><font><font>
的setTimeout(函数(){...},1000); </font></font>
<font><font>
//而不是elt.setAttribute(“onclick”事件,“...”)使用:</font></font><font><font>
elt.addEventListener(“点击”,函数(){...},FALSE); </font></font></pre>

<p><a href="/en-US/docs/Web/JavaScript/Closures" title="的JavaScript /指南/瓶盖"><font><font>闭包</font></font></a><font><font>也作为一种方式来创建参数化功能,而无需连接字符串很有帮助。</font></font></p>

<h3 id="Parsing_JSON_(converting_strings_to_JavaScript_objects)"><font><font>JSON解析(字符串转换为JavaScript对象)</font></font></h3>

<p><font><font>如果你调用该字符串</font></font><code>eval()</code><font><font>的包含数据(例如,一个数组:</font></font><code>"[1, 2, 3]"</code><font><font>),而不是代码,你应该考虑切换到</font></font><a href="/en-US/docs/Glossary/JSON" title="JSON"><font><font>JSON</font></font></a><font><font>,这使得该字符串使用JavaScript语法的子集来表示数据。</font><font>又见</font></font><a href="/en-US/docs/Downloading_JSON_and_JavaScript_in_extensions" title="Downloading_JSON_and_JavaScript_in_extensions"><font><font>下载JSON和JavaScript扩展</font></font></a><font><font>。</font></font></p>

<p><font><font>请注意,由于JSON语法是比较JavaScript语法的限制,许多有效的JavaScript文字不会解析为JSON。</font><font>例如,尾随逗号没有在JSON允许的,并在对象文本属性名称(键)必须用引号括起来。</font><font>一定要使用一个JSON序列生成稍后将解析为JSON字符串。</font></font></p>

<h3 id="Pass_data_instead_of_code"><font><font>通过数据,而不是代码</font></font></h3>

<p><font><font>例如,设计凑的网页的网页内容的扩展可能在定义的规则,刮</font></font><a href="/en-US/docs/XPath" title="XPath的"><font><font>的XPath</font></font></a><font><font>,而不是JavaScript代码。</font></font></p>

<h3 id="Run_code_with_limited_privileges"><font><font>在有限的权限运行代码</font></font></h3>

<p><font><font>如果你必须运行代码,可以考虑降低权限运行它。</font><font>这个建议主要适用于扩展和XUL应用程序,它可以使用</font></font><a href="/en-US/docs/Components.utils.evalInSandbox" title="Components.utils.evalInSandbox"><font><font>Components.utils.evalInSandbox</font></font></a><font><font>这一点。</font></font></p>

<h2 id="Examples"><font><font>例子</font></font></h2>

<h3 id="Using_eval"><font><font>运用 </font></font><code>eval</code></h3>

<p><font><font>在下面的代码,既包含语句</font></font><code>eval()</code><font><font>返回42.第一个计算字符串“ </font></font><code>x + y + 1</code><font><font>”; </font><font>第二个计算字符串“ </font></font><code>42</code><font><font>”。</font></font></p>

<pre class="brush:js">
<font><font>变种X = 2;</font></font><font><font>
变种Y = 39;</font></font><font><font>
VAR Z =“42”;</font></font><font><font>
的eval(“X + Y + 1”); </font><font>//返回42</font></font><font><font>
的eval(Z); </font><font>//返回42</font></font>
</pre>

<h3 id="Using_eval_to_evaluate_a_string_of_JavaScript_statements"><font><font>使用</font></font><code>eval</code><font><font>评估JavaScript语句的字符串</font></font></h3>

<p><font><font>下面的示例使用</font></font><code>eval()</code><font><font>来评估串</font></font><code>str</code><font><font>。</font><font>该字符串由打开一个警告对话框,指定JavaScript语句</font></font><code>z</code><font><font>如果值为42 </font></font><code>x</code><font><font>是五,并分配0 </font></font><code>z</code><font><font>,否则。</font><font>当执行第二条语句,</font></font><code>eval()</code><font><font>将导致执行这些语句中,并且它也将评估一组语句,并返回分配给的值</font></font><code>z</code><font><font>。</font></font></p>

<pre class="brush:js">
<font><font>VAR X = 5;</font></font><font><font>
无功海峡=“如果(X == 5){执行console.log('z是42'); Z = 42;}否则Z = 0;”;</font></font>
<font><font>
的console.log(“z是”的eval(STR));</font></font></pre>

<h3 id="Last_expression_is_evaluated"><font><font>最后表达式求值</font></font></h3>

<p><code>eval()</code><font><font> 返回最后计算的表达式的值。</font></font></p>

<pre class="brush:js">
<font><font>无功海峡=“如果(一){1 + 1;}其他{1 + 2;}”;</font></font><font><font>
VAR一个= TRUE;</font></font><font><font>
变种B =的eval(STR); </font><font>//返回2</font></font>
 <font><font>
的console.log(“b为:”+ B);</font></font>
<font><font>
A = FALSE;</font></font><font><font>
B =的eval(STR); </font><font>//返回3</font></font>
<font><font>
的console.log(“b为:”+ B);</font></font></pre>

<h3 id="eval_as_a_string_defining_function_requires_(_and_)_as_prefix_and_suffix"><code>eval</code><font><font> 作为定义函数字符串要求“(”和“)”作为前缀与后缀</font></font></h3>

<pre class="brush:js">
<font><font>变种fctStr1 =“函数a(){}”</font></font><font><font>
变种fctStr2 =“(函数a(){})”</font></font><font><font>
VAR fct1 =的eval(fctStr1)//返回未定义</font></font><font><font>
VAR fct2 =的eval(fctStr2)//返回一个函数</font></font>
</pre>

<h2 id="Specifications"><font><font>产品规格</font></font></h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col"><font><font>规范</font></font></th>
   <th scope="col"><font><font>状态</font></font></th>
   <th scope="col"><font><font>评论</font></font></th>
  </tr>
  <tr>
   <td><font><font>{{SpecName('ES1')}}</font></font></td>
   <td><font><font>{{Spec2('ES1')}}</font></font></td>
   <td><font><font>初始定义。</font></font></td>
  </tr>
  <tr>
   <td><font><font>{{SpecName('ES5.1','#仲丁基15.1.2.1','的eval')}}</font></font></td>
   <td><font><font>{{Spec2('ES5.1')}}</font></font></td>
   <td>&nbsp;</td>
  </tr>
  <tr>
   <td><font><font>{{SpecName('ES6','#仲的eval-X','的eval')}}</font></font></td>
   <td><font><font>{{Spec2('ES6')}}</font></font></td>
   <td>&nbsp;</td>
  </tr>
  <tr>
   <td><font><font>{{SpecName('ESDraft','#仲的eval-X','的eval')}}</font></font></td>
   <td><font><font>{{Spec2('ESDraft')}}</font></font></td>
   <td>&nbsp;</td>
  </tr>
 </tbody>
</table>

<h2 id="Browser_compatibility"><font><font>浏览器兼容性</font></font></h2>

<p><font><font>{{CompatibilityTable}}</font></font></p>

<div id="compat-desktop">
<table class="compat-table">
 <tbody>
  <tr>
   <th><font><font>特征</font></font></th>
   <th><font><font>铬</font></font></th>
   <th><font><font>火狐(壁虎)</font></font></th>
   <th><font><font>IE浏览器</font></font></th>
   <th><font><font>歌剧</font></font></th>
   <th><font><font>苹果浏览器</font></font></th>
  </tr>
  <tr>
   <td><font><font>基本支持</font></font></td>
   <td><font><font>{{CompatVersionUnknown}}</font></font></td>
   <td><font><font>{{CompatVersionUnknown}}</font></font></td>
   <td><font><font>{{CompatVersionUnknown}}</font></font></td>
   <td><font><font>{{CompatVersionUnknown}}</font></font></td>
   <td><font><font>{{CompatVersionUnknown}}</font></font></td>
  </tr>
 </tbody>
</table>
</div>

<div id="compat-mobile">
<table class="compat-table">
 <tbody>
  <tr>
   <th><font><font>特征</font></font></th>
   <th><font><font>Android版</font></font></th>
   <th><font><font>Android版Chrome</font></font></th>
   <th><font><font>Firefox移动(壁虎)</font></font></th>
   <th><font><font>IE浏览器移动</font></font></th>
   <th><font><font>Opera移动</font></font></th>
   <th><font><font>移动Safari浏览器</font></font></th>
  </tr>
  <tr>
   <td><font><font>基本支持</font></font></td>
   <td><font><font>{{CompatVersionUnknown}}</font></font></td>
   <td><font><font>{{CompatVersionUnknown}}</font></font></td>
   <td><font><font>{{CompatVersionUnknown}}</font></font></td>
   <td><font><font>{{CompatVersionUnknown}}</font></font></td>
   <td><font><font>{{CompatVersionUnknown}}</font></font></td>
   <td><font><font>{{CompatVersionUnknown}}</font></font></td>
  </tr>
 </tbody>
</table>
</div>

<h2 id="Gecko-specific_notes"><font><font>Gecko的具体注意事项</font></font></h2>

<ul>
 <li><font><font>历史上</font></font><code>eval()</code><font><font>有一个任选的第二个参数,指定一个对象在其上下文中评价为要执行。</font><font>这种说法是不规范的,并且从SpiderMonkey的壁虎在1.9.1(火狐3.5)被删除。</font><font>见{{错误(442333)}}。</font></font></li>
</ul>

<h2 id="See_also"><font><font>也可以看看</font></font></h2>

<ul>
 <li><font><font>{{jsxref(“Global_Objects / uneval”,“uneval()”)}}</font></font></li>
 <li><a href="/en-US/docs/Web/JavaScript/Reference/Operators/Property_Accessors"><font><font>属性访问器</font></font></a></li>
</ul>
Revert to this revision