关于eval一道笔试题

var a = 1;
function f() {
  var a = 2;
  var e = eval;
  e('console.log(a)')
}
f();

以上代码在浏览器控制台输出1,请问为什么不是输出2呢

阅读 3k
5 个回答

如果你间接的使用 eval(), 如通过一个引用来调用它而不是直接的调用eval。 从ECMAScript 5起它工作在全局作用域而不是局部作用域中;这里是var e=eval;所以是间接调用了,所以是全局的,可以参考https://developer.mozilla.org...

如果你间接的使用 eval(), 如通过一个引用来调用它而不是直接的调用eval。 从ECMAScript
5起它工作在全局作用域而不是局部作用域中https://developer.mozilla.org...

var e = eval;e('console.log(a)')是间接使用,所以a是全局作用域的变量

如果你把eval赋值给e,相当于把window.eval赋值给e,这时e是全局作用域上的,执行的时候回去寻找全局域上的a,所以是1,如果你不复制,直接使用eval('console.log(a)'),它默认是在本地函数作用域进行,所以是2

可以参考mdn关于eval的解释:eval()

如果你间接的使用 eval(), 如通过一个引用来调用它而不是直接的调用eval。 从ECMAScript 5起它工作在全局作用域而不是局部作用域中

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题