在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
之后无法看到?
答案 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
})();