Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

eval 与 let 的思考

 eval原本是可以直接在当前作用域中执行代码的,但这样会使逻辑变得很不严谨。后来,严格模式中对eval做了一些限制,它会在其内部创建一个作用域,但和Function构造器不同的是它依然可以访问局部变量。现在再考虑上 ES6+ 的各种新特性,eval该何去何从?

「块作用域什么的我从来都没听说过!」

  eval无法理解块作用域,执行的let可能被解析为类似var的行为,至少 Firefox 目前的实现是如此。 <script type="application/javascript;version=1.7">
void function(){
  let a = 1;
  {
    eval("let a = 2;");
    console.log(a);
  }
  console.log(a);
}();
</script>

延伸的思考

  其实这并不是个什么大问题,只是这个问题比较典型,让我想了很多。由于eval的存在,整个 JavaScript 要考虑的奇怪的问题多出了一大圈。也许它真不该存在了吧?每当一个新特性被加入,都要考虑一下eval问题,而且实际上会遇到的情况并不多。考虑临界情况本身没有问题,但是由eval的存在,临界情况更加边缘化,这样真的好吗?
  虽然目前的严格模式限制了eval的一些特性,但感觉它依然在妨碍语言的进步。是不是差不多到该废除的时候了?其实规范中废除也不会有什么问题,比如块作用域中定义函数一直都不在规范中,但浏览器一直在兼容,使用一直是普遍存在的。eval是不是也可以就这么从规范里移除掉,让浏览器自己看着办呢?

网名:
52.91.185.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^