在 Safari 中评估表达式 const 变量范围

Evaluated expression const variable scope in Safari

很想知道为什么这个表达式:

eval("const a = function () {}; function b() {  a(); }; b();")

在 Safari 10.1.2 中 运行 时抛出错误:

ReferenceError: Can't find variable: a

我怀疑使用 const(或 let)将此变量放入某个内部 eval 的范围内,而在 eval 内部调用的函数正在使用:

  1. 全局范围,如果它们由 function X(){} 定义;
  2. 内部范围,如果它们被定义为 const X = function(){}

例如,使用const:

> eval('const a = function(){ return 42; }; a();')
42
> a
ReferenceError: Can't find variable: a

使用var:

> eval('var a = function(){ return 42; }; a();')
42
> a
function (){ return 42; }

支持这个理论:

> eval('const a=function(){return 42;}; const b=function(){return a();}; b();')
42
> a
ReferenceError: Can't find variable: a
> b
ReferenceError: Can't find variable: b

所以,如果我们以相同的方式定义这两个函数,它就会起作用。

现在,让我们在全局范围内定义函数 a,而不使用 eval:

> a = function(){ return 23;}

让我们 运行 eval 来自您问题的代码(向两个函数添加 returns):

> eval("const a = function(){return 42;}; function b(){return a();}; b();")
23

如您所见,函数 b 正在全局范围内使用 a