javascript-锁定eval执行时this为window全局变量

先看看下面一段代码

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值