先看看下面一段代码
var x = 'outer';
(function a() {
var x = 'inner';
eval('console.log("direct call: " + x, this)');
(1,eval)('console.log("indirect call: " + x, this)');
}).call({});
上面的代码输出是这样的
direct call: inner {}
VM738234:1 indirect call: outer Window
所以如果需要eval保持上下文为window就使用下面的方式来调用eval
(1,eval)('console.log("indirect call: " + x, this)');
在执行eval的时候存在直接执行和间接执行的区别,它们的运行时的上下文是不一样的,直接执行时为当前执行的this,而间接执行上下文是稳定的window。
也可以试一下下面的代码对eval上下文进行了解
var b = 'outer';
(function a() {
var c = 'inner';
eval('console.log("direct call: " + b, this)');
(1,eval)('console.log("indirect call: " + c, this)');
}).call({});
上面的代码输出是这样的,直接调用可以往上层空间查找变量,而间接调用上下文是window就不能查找到内部变量
direct call: outer {}
VM738295:1 Uncaught ReferenceError: c is not defined
at eval (eval at a (cgform:5:11), <anonymous>:1:33)
at eval (<anonymous>)
at Object.a (<anonymous>:5:11)
at <anonymous>:6:4
参考链接
(1, 评估)('this') 与 JavaScript 中的 eval('this')?- 堆栈溢出 (stackoverflow.com)