Javascript变量捕获

Ser*_*yan 7 javascript eval

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

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

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

f()();
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

10
undefined:1
console.log(x);
            ^
ReferenceError: x is not defined
Run Code Online (Sandbox Code Playgroud)

为什么使用eval明确捕获xglobal['eval']不是?即使global['eval']没有捕获x,为什么它无法看到eval,已经捕获x

Stv*_*dll 6

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

来自Mozilla的Javascript参考:

如果间接使用eval函数,通过eval之外的引用调用它,从ECMAScript 5开始,它在全局范围而不是本地范围内工作; 例如,这意味着函数声明会创建全局函数,并且被评估的代码无法访问调用它的范围内的局部变量.

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