zoukankan      html  css  js  c++  java
  • 【JavaScript】标准内置函数 eval

    以下内容为学习记录,可以参考 MDN 原文。

    环境

    • node v12.18.1
    • npm 6.14.5
    • vscode 1.46
    • Microsoft Edge 83

    概念

    eval() 是全局对象的一个函数属性。

    eval() 的参数是一个字符串。如果字符串表示的是表达式,eval() 会对表达式进行求值。
    如果参数表示一个或多个 JavaScript 语句,那么eval() 就会执行这些语句。
    不需要用 eval() 来执行一个算术表达式:因为 JavaScript 可以自动为算术表达式求值。

    如果你以字符串的形式构造了算术表达式,那么可以在后面用 eval() 对它求值。
    例如,假设你有一个变量 x,您可以通过将表达式的字符串值(例如 3 * x + 2)赋值给一个变量,
    然后在你的代码后面的其他地方调用 eval(),来推迟涉及 x 的表达式的求值。

    如果 eval() 的参数不是字符串, eval() 会将参数原封不动地返回。
    在下面的例子中,String 构造器被指定,而 eval() 返回了 String 对象而不是执行字符串。

    eval(new String("2 + 2")); // 返回了包含"2 + 2"的字符串对象
    eval("2 + 2");             // returns 4
    

    你可以使用一些通用的方法来绕过这个限制,例如使用 toString()。

    var expression = new String("2 + 2");
    eval(expression.toString());
    

    如果你间接的使用 eval(),比如通过一个引用来调用它,而不是直接的调用 eval。
    从 ECMAScript 5 起,它工作在全局作用域下,而不是局部作用域中。这就意味着,例如,下面的代码的作用声明创建一个全局函数,并且 eval 中的这些代码在执行期间不能在被调用的作用域中访问局部变量。

    function test() {
      var x = 2, y = 4;
      console.log(eval('x + y'));  // 直接调用,使用本地作用域,结果是 6
      var geval = eval; // 等价于在全局作用域调用
      console.log(geval('x + y')); // 间接调用,使用全局作用域,throws ReferenceError 因为`x`未定义
      (0, eval)('x + y'); // 另一个间接调用的例子
    ​}
    

    永远不要使用 eval!

  • 相关阅读:
    KVM镜像管理利器-guestfish使用详解
    两台linux机器时间同步
    git配合tortoiseGit的基础使用
    使用yum来下载RPM包而不进行安装
    Linux解压缩总结
    Linux下使用git命令及github项目
    linux shell常用快捷键
    调用 sphinx-build生成HTML文件
    复制virtualenv环境到其他服务器环境配置的方法
    CentOS 6.5 PYPI本地源制作
  • 原文地址:https://www.cnblogs.com/jiangbo44/p/13416813.html
Copyright © 2011-2022 走看看