在 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
内部调用的函数正在使用:
- 全局范围,如果它们由
function X(){}
定义;
- 内部范围,如果它们被定义为
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
来自您问题的代码(向两个函数添加 return
s):
> eval("const a = function(){return 42;}; function b(){return a();}; b();")
23
如您所见,函数 b
正在全局范围内使用 a
。
很想知道为什么这个表达式:
eval("const a = function () {}; function b() { a(); }; b();")
在 Safari 10.1.2 中 运行 时抛出错误:
ReferenceError: Can't find variable: a
我怀疑使用 const
(或 let
)将此变量放入某个内部 eval
的范围内,而在 eval
内部调用的函数正在使用:
- 全局范围,如果它们由
function X(){}
定义; - 内部范围,如果它们被定义为
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
来自您问题的代码(向两个函数添加 return
s):
> eval("const a = function(){return 42;}; function b(){return a();}; b();")
23
如您所见,函数 b
正在全局范围内使用 a
。