gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:31:01 24 4
gpt4 key购买 nike

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

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 代码(将 return 添加到两个函数):

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

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

关于javascript - 在 Safari 中评估表达式 const 变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46036960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com