Javascript变量捕获

时间:2016-09-17 20:06:30

标签: javascript eval

在JS中使用eval时,我遇到了奇怪的行为。

var f = function () {
    var x = 10;

    return function () {
        eval('console.log(x);');
        window['eval']('console.log(x);');
    }
};

f()();

输出:

10
undefined:1
console.log(x);
            ^
ReferenceError: x is not defined

为什么使用eval明确捕获x,但global['eval']却没有? 即使global['eval']无法捕获x,为什么在eval已经捕获x之后无法看到?

4 个答案:

答案 0 :(得分:6)

window [' eval']在全局范围内运行,eval()在本地范围内运行。

来自Mozilla的Javascript参考:

  

如果你间接使用eval函数,可以通过a调用它   除了eval之外的参考,从ECMAScript 5开始,它在全球范围内工作   而不是局部范围;这意味着,例如,该功能   声明创建全局函数,代码是   评估无法访问范围内的局部变量   在哪里被召唤。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval

答案 1 :(得分:3)

您的内部函数实际上并未捕获x的引用,因此它永远不会直接传递给eval

eval通常有效at the local scope,因此第一次调用成功(因为本地范围包含x的声明)。

但是,如果以不直接引用它的方式调用eval,它将在全局范围内调用自身,var x不属于该范围,并且失败。

只是不要使用eval。

答案 2 :(得分:1)

您可以使用Function.prototype.bind()x传递给返回的函数

var f = function () {
    var x = 10;

    function y(n) {
        eval(`console.log(${n})`);
        window["eval"](`console.log(${n})`);
    }

    return y.bind(this, x)
};

f()();

答案 3 :(得分:1)

window.eval在全局范围内工作。

var variable = 1;

(function(){
  var variable = 100,
      cmd = "++variable";
  document.write(eval(cmd)+"\n"); // increment local var 100 and output 101
  document.write(window.eval(cmd)+"\n"); // increment global var 1 and output 2
})();