在这种情况下,找到了内置函数Number
。我想考虑一下,因为我在下面提出的问题可以在规范中的其他函数中找到。
如果我们打开规范,我们会看到以下内容:
20.1.1.1数字(值)
使用参数值调用Number时,以下步骤为 采取:
- 如果没有参数传递给这个函数调用,那么就是 0
- 否则,让我们呢? ToNumber(值)。
- 如果未定义NewTarget,请返回n。
- 让O成为? OrdinaryCreateFromConstructor(NEWTARGET, “%NumberPrototype%”,«[[NumberData]]»)。
- 将O。[[NumberData]]设置为n。
- 返回O。
醇>
基于此,我想问几个问题:
NewTarget
它来自哪里?NewTarget = undefined
转换为数字NewTarget != undefined
,则将此函数称为构造函数。 让我们进一步阐明所有要点。
12.3.3.1运行时语义:评估
NewExpression:new NewExpression
- 回来? EvaluateNew(NewExpression,空)。
醇>MemberExpression:new MemberExpressionArguments
- 回来? EvaluateNew(MemberExpression,Arguments)。
醇>12.3.3.1.1运行时语义:EvaluateNew(constructExpr,arguments)
带有参数constructExpr和的抽象操作EvaluateNew arguments执行以下步骤:
- 断言:constructExpr是NewExpression或者是 MemberExpression。
- 断言:参数为空或参数。
- 让ref成为评估constructExpr。
的结果- 让构造函数成为?的GetValue(REF)。
- 如果参数为空,则让argList为新的空列表。
否则,
一个。设argList为参数的ArgumentListEvaluation。湾ReturnIfAbrupt(arglist中)。
- 如果IsConstructor(构造函数)为false,则抛出TypeError异常。
- 回来?构造(构造函数,argList)。
醇>
当您通过new
运算符调用某个函数时(我们将很容易地在没有参数的情况下执行),我们会看到Return 'line. EvaluateNew (NewExpression, empty)
在这一行中,NewExpression
是Number
功能,对吧?如果一切正确则更进一步。接下来,我们在EvaluateNew
算法中看到有一行如下所示:Let's get the result of evaluating constructExpr.
- 这是什么意思?这意味着我们需要在继续执行算法之前计算ref
是什么?如果我没有弄错,那么ref
就是Number
函数。所以我们被要求从Number
函数执行算法的行?如果是这种情况,那么我们在Number
算法中遇到问题,因为我们不知道NewTarget
有什么价值。
您理解的问题在于我不理解Number
与operator new
的互动。我请你帮忙解决一下。
答案 0 :(得分:2)
NewTarget
- 它来自哪里?
来自[[call]]ing a builtin function object或来自[[construct]]ing a builtin function object。
如果此算法同时用于构造函数和简单转换为数字,那么如果
NewTarget = undefined
转换为数字NewTarget != undefined
,则将此函数称为构造函数。
这不是一个问题,这是一个(真实的)陈述。
在这一行中,
NewExpression
是Number
函数,对吗?
没有。 NewExpression constructExpr
是表达式,即new
运算符具有的任何操作数的抽象语法树。这可以是任何表达式,例如具有IdentifierReference的PrimaryExpression,其评估为全局Number
函数(或对其的引用) - 在评估它时,这正是第3步所做的