【问题标题】:Does JavaScript compile the function every time it is invoked?JavaScript 每次调用时都会编译该函数吗?
【发布时间】:2013-12-05 03:35:32
【问题描述】:

假设我有这个功能:

function A() {
  function B() {
    return 1;
  }

  return 1 + B();
}

每次调用函数A时,函数B会被编译吗?

我记得有人说不会。但是我的记忆变得生疏了,我找不到参考。

【问题讨论】:

  • JavaScript 是一种解释型语言...编译的意思是什么?
  • 我不知道不同引擎应用了哪些优化,但是在 JavaScript 层面,每次调用 A 都会创建一个新的函数 B。
  • @Josiah:现代浏览器中的引擎进行 JIT 编译。
  • @FelixKling:是的,但是无论后端做什么,JavaScript 仍然是一种解释性语言。即使这样,JIT 也只是缓存的解释
  • @JosiahHester 你不正确。现代引擎包含经典的前端和后端并生成本机代码。这称为代码的 JIT 或即时编译。代码已编译。解释语言与编译语言二分法的过时概念已成为过去。

标签: javascript compiler-optimization


【解决方案1】:

JavaScript 标准规定 JavaScript 执行环境必须解析函数并产生早期错误,拒绝执行脚本中存在的任何代码(例如缺少右引号、不匹配的花括号等)。它没有说明之后发生的事情。

但是,所有现代引擎都会在执行函数之前生成与函数对应的本机代码。所有后续调用都将使用之前生成的代码。有时,引擎会使用它通过执行收集的信息来重新生成代码,或者如果它可以确定这会导致更好的执行时间,它可能会内联函数的代码。

【讨论】:

    【解决方案2】:

    JavaScript 是一种解释型语言,而不是编译型语言,因此它从不编译函数。

    编辑:除非您的 javascript 引擎通过编译进行了优化,在这种情况下,它取决于它是哪个引擎,但不要担心,因为它不会无缘无故地重新编译它。

    【讨论】:

    • 你应该告诉那些从事 V8 工作的人,告诉他们他们的 JIT 编译不存在!
    【解决方案3】:

    如果你的意思是invoked(或called)而不是编译,答案是肯定的。每次调用 A 时都会调用 B,因为 A 调用 B。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      相关资源
      最近更新 更多