gpt4 book ai didi

JavaScript:函数执行顺序

转载 作者:行者123 更新时间:2023-11-29 23:59:08 26 4
gpt4 key购买 nike

我正在学习JavaScript,但是有很多东西我无法理解。在一次在线 JavaScript 测验中,出现了以下问题:
以下 JavaScript 代码将向控制台记录什么:

const a = {};
const b = () => a.a = () => {};
const c = c => '' + c + a.a(b());
const d = console.log.bind(console);
const e = (e => () => d(c(e++)))(0);

try{
e();
}catch(a){
e();
}

我花了一些时间来理解每个变量(这里是常量)代表什么。我从 try block 中的 e() 开始分析代码。所以,e 代表一个闭包,这意味着函数 d 将使用参数 c(0)e 被调用> 将变为 1。据我了解,这里的d基本上代表了console.log函数(但我想不通为什么要使用bind?)。

现在,我知道首先会执行 c(0) 然后将结果记录到控制台,对吧?让我们看一下函数 c。它返回转换为字符串的第一个参数和 a.a(b()) 的连接结果。好的,所以 a.a(b()) 将首先执行,对吗?但是,问题是因为 a.a 不是一个函数,它是未定义的,所以会抛出错误,我们去 catch

现在,在 catch block 中,一切都应该是一样的,所以 a.a 仍然不是一个函数,应该抛出引用错误。但是,当我看到没有抛出任何错误,但控制台实际上记录了 1undefined 时,我感到很惊讶。为什么?怎么办?

好吧,经过一番思考,我意识到也许在调用 a.a(b()) 时可能会先执行 b() 。按照我的假设,然后函数 b 将引用分配给一个对对象 a 的属性 a 没有任何作用的函数,对吗?但是,a.a 是一个函数,它将在 try block 中执行,并且 0undefined 将被记录。

然而,这两个假设都不正确。这里的主要问题是先执行什么?如果我们调用 someObject.propertyWhichIsNotAFunction(somethingWhichMakesItAFunction),会发生什么?首先执行什么?似乎在 try block 中首先执行一件事,而在 catch 中则执行另一件事。这对我来说真的毫无意义。有什么解释吗?

最佳答案

这与Why is the value of foo.x undefined in foo.x = foo = {n: 2}?的原因非常相似,只是有点棘手,因为它依赖于在执行中何时抛出 TypeError。

基本上发生的是:

  1. a.a 被评估以找出稍后在第 3 步中调用的函数。
  2. b() 被评估,因为它是一个函数参数,它的返回值value 成为任何 a.a 评估结果的实际参数。
  3. 无论 a.a 在第 1 步中的计算结果如何,都将以 b() 的返回值作为参数执行。

规范的相关部分在这里:https://www.ecma-international.org/ecma-262/7.0/index.html#sec-function-calls

请注意,调用函数时发生的第一件事是:

  1. Let ref be the result of evaluating MemberExpression.
  2. Let func be ? GetValue(ref).

这意味着 a.a 被求值,它引用的函数称为 func。第一次围绕 a.a 评估为 undefined,因此 funcundefined 并且将在第 2 步抛出 TypeError的 https://www.ecma-international.org/ecma-262/7.0/index.html#sec-evaluatedirectcall ,它是 after ArgumentListEvaluation(arguments),它调用 b() 并为 a.a,但不在 func 的值之后。

关于JavaScript:函数执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41006359/

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