eval

因为各种规范都不推荐用,所以没仔细看过

返回值 ,行为和逗号操作符很相像,看个例子,就差不多了。

const log = console.log;
let x = null,str = null;
str = "x=10;";
log(eval(str)); // 10
str = "x=10;(function(){})();";
log(eval(str)); // undefined
str = "x=20;(function(){return x;})();";
log(eval(str)); // 20

/* 可以看出,行为和逗号操作符很相像 */
log(
(x=110)
); // 110
log(
(x=110,(function(){})())
); // undefined
log(
(x=210,(function(){return x;})())
); // 210

 

(new)调用方式:直接、间接,补充了一下this

(old)调用方式:直接、间接

间接调用,直接使用全局作用域

// mdn的例子
function test() {
  var x = 2, y = 4;
  console.log(eval("x + y"));  // 直接调用,使用本地作用域,结果是 6
  var geval = eval; // 等价于在全局作用域调用
  console.log(geval("x + y")); // 间接调用,使用全局作用域,throws ReferenceError 因为`x`未定义
  (0, eval)('x + y'); // 另一间接调用的例子
​}
test();

主要说一下这个 (0, eval)('x + y'); // 另一间接调用的例子

1、首先逗号操作符返回最后一个值

2、(0,eval)是个表达式,使用了逗号操作符,相当于是求值操作,求值之后是eval。。等价于间接调用了

3、改动一下例子

// 不使用 逗号操作符
function test() {
  var x = 2, y = 4;
  console.log(
     (eval)('x + y')
  ); // 6
​}
test();
// 使用 逗号操作符
function test() {
  var x = 2, y = 4;
  console.log(
     (eval,eval)('x + y')
  ); // ReferenceError x is not defined,由于间接调用,又成了全局作用域
​}
test();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值