【问题标题】:In JavaScript, what code executes at runtime and what code executes at parsetime?在 JavaScript 中,哪些代码在运行时执行,哪些代码在解析时执行?
【发布时间】:2017-11-10 20:04:59
【问题描述】:

尤其是对象,我不明白对象的哪些部分在初始化之前运行,哪些在初始化时运行,哪些在初始化之后运行。

编辑:似乎 parsetime 是错误的词。我想我应该提出一个问题“在 2-pass 读取中,第一次读取什么内容,第二次读取什么内容?”

【问题讨论】:

  • 这取决于你的代码。
  • 当您询问 Javascript 时,您是指在网络浏览器环境中使用它吗?
  • @Spudley,我不知道它可以在任何其他环境中使用,所以是的。
  • 有服务器端的 JS 实现,此外它还作为脚本语言内置在一些其他应用程序中。
  • 很好的问题,但我也会在别处寻找一个好的答案。

标签: javascript runtime


【解决方案1】:

一个 javascript 文件在 2-pass 读取中运行。第一遍解析语法并收集函数定义,第二遍实际执行代码。这可以通过注意到以下代码起作用来看出:

foo();

function foo() {
  return 5;
}

但以下没有

foo(); // ReferenceError: foo is not defined

foo = function() {
  return 5;
}

但是,知道这并不是真正有用,因为在第一遍中没有任何执行。你根本无法利用这个特性来改变你的逻辑。

【讨论】:

  • 知道这一点非常有用,因为我很容易在您的第二个示例中编写了代码,但不明白为什么它不起作用。另外,我没有意识到在第一轮中没有执行,所以你肯定是在为我解决问题。
  • @Gareth - var foo = function(){return 5;}) //undefined 不是函数呢?
  • @GalMargalit 不,你会得到一个语法错误(额外的括号)。如果您谈论的是 IIFE,您将收到未定义的错误。这也在运行时执行。
【解决方案2】:

与 C++ 不同,无法在 Javascript 解析器中运行逻辑。

我怀疑您是在询问哪些代码会立即运行,哪些代码会在您创建每个对象实例时运行。

答案是,你调用的函数中的任何代码只会在你调用函数时运行,而函数外的任何代码都会立即运行。

【讨论】:

  • 有什么方法可以在对象初始化时创建一个函数?
  • @Randomable: 什么样的对象?您可以在构造函数中调用该函数。
  • 好的,所以你必须调用它?没有创建使其自动运行的函数的语法吗?我想你刚才无意中回答了我的问题。
  • @SLaks 你说:The answer is that any code in a function that you call will only run when you call the function, whereas any code outside of a function will run immediately.。你能解释一下下面的例子(IIFE)吗? jsfiddle.net/GuyT/f81pg5hk
  • @GuyT:当你调用它时,一个 IIFE 就会运行。您只是碰巧立即调用它。
【解决方案3】:

不知道你问的到底是什么,所以我就分享一下我知道的。

JavaScript 函数被“预加载”并存储在浏览器的内存中,这意味着当您在页面的最后声明了函数并在最开始调用它的代码时,它将起作用。

请注意,全局变量,即在函数之外分配的任何变量,不会预加载,因此只能在声明后使用。

函数外的所有命令都将按照它们出现的顺序进行解析。

JavaScript 并没有真正的“运行时”,它只能响应事件或通过全局计时器执行代码。任何其他代码都将被解析并“忘记”。

【讨论】:

  • JavaScript global variables, meaning any variable assigned outside of a function, are also preloaded and can be used by code anywhere in the page. 我们可以在初始化之前使用它吗,我们使用解析时间函数的方式,即function foo() { }?我认为没有。全局变量只能在初始化后使用。这不起作用console.log(a); var a = 20;
  • @LalZada 嗯...我写这篇文章的时候检查了一下,很快会再次测试。
  • @LalZada 好吧,这很尴尬......要么 JS 发生了变化,要么我没有先检查就发布了这个。已编辑,谢谢提醒! :)
  • 您可能知道 Javascript 首先进行 提升,因此 console.log(a); var a = 20; 实际上等于 var a; console.log(a); a = 20;。变量a 已声明但尚未初始化(定义),然后我们使用控制台打印它。
  • @LalZada 是的,这是有道理的。
【解决方案4】:

虽然 JavaScript 的直接祖先是 Scheme,但 JavaScript 没有继承宏,所以答案相当简单:在解析期间从不任何代码运行。

【讨论】:

  • 你的意思不是“自我”,而不是“计划”吗?这就是它获得原型继承的地方。它真的没有从 Scheme 中得到那么多。
【解决方案5】:

粗略地说,解释器首先获取所有变量和函数,然后将它们提升并执行。

有关更多详细信息,我希望这些链接可能会有所帮助:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多