未吊装的功能定义

function definitions not hoisted

本文关键字:功能 定义      更新时间:2023-09-26

W.r.t 提升 fxn 定义。

if (true) {
  function foo() {
    alert(1)
  }
} else {
  function foo() {
    alert(2)
  }
}
foo()

铬,大约 2-3 个月前 - 会打印 2。现在,它正在打印 1。我错过了什么,还是控制台停止在 fxn 上吊起!

演示 -- 打印 1.我不确定在哪里可以找到旧浏览器版本的演示。可能是较旧的 v8 引擎的节点安装?当前镀铬版本 - 49

您拥有的代码在严格模式下无效。函数不会被从块中提升出来(或者至少不应该(,块内的函数声明在 ES6 之前是完全非法的。你应该写

"use strict";
var foo;
if (true) {
  foo = function() {
    alert(1)
  };
} else {
  foo = function() {
    alert(2)
  };
}
foo()

以获得具有可重复和预期结果的所需行为。

我错过了什么,还是控制台停止在 fxn 上吊起!

看起来 V8 已更新以符合 ES6 规范。它确实将它们"提升"到函数/顶部范围,但仅在实际遇到声明时(在您的情况下,有条件地(。

应避免使用有条件创建的函数。

例如,假设以下代码:

if (false){
 function foo(){
  console.log(1)
 }
}
foo()

Firefox 不会提升该功能,这将导致ReferenceError: foo is not defined .然而,Chrome仍然提升了该功能并打印1 。所以显然你已经处理了不同的浏览器行为。因此,根本不要做这样的事情(或者如果你真的想,可以使用函数表达式(。

另请参阅 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function

函数可以有条件地声明,即函数语句可以嵌套在 if 语句中。Mozilla 以外的大多数浏览器都会将此类条件声明视为无条件声明,并创建函数,无论条件是否为真,请参阅本文了解概述。因此,不应使用它们,对于条件创建,请使用函数表达式。

特别是查看链接的文章,该文章在某种程度上解释了您所看到的问题。因此,Chrome似乎在这方面发生了一些变化。但同样,不要使用有条件创建的函数。

请注意,正如 FREEZE 所评论的那样,您应该使用不允许此类代码但抛出异常的'use strict';