未吊装的功能定义
function definitions not hoisted
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';
。
- 谷歌电子表格的自定义xml解析功能
- 为什么获胜'我的自定义功能工作
- 自定义HTML5视频控件-退出按钮不会启动全屏切换功能
- 如何通过悬停或点击谷歌电子表格中的单元格来运行自定义功能
- 为什么这个功能打印“;未定义的未定义的“;作为联系人名称,添加“新对象”
- 确认框功能未定义
- 将自定义Google Sheets功能转换为附加组件
- 使用html 5对元素执行自定义表单验证功能
- 具有onclick功能的自定义复选框在实际切换复选框之前执行功能
- 如何使用自定义功能覆盖时间轴对象.js时间轴对象的_repaintMinorText
- CKEditor-自定义单词或短语插入功能
- 通过单向绑定的过滤功能提高自定义角度下拉菜单中的角度性能
- 角度:ui选择.具有“刷新”功能的自定义标记
- 从用户脚本空间重新定义Firefox中的原生浏览器功能
- 从对象旋转对象.带有自定义动画功能的trix.setrotationfromleuler
- 在PhpStorm中创建自定义语言,扩展所有html语言功能
- "键未定义”;在AngularJS'的自定义筛选功能
- Wordpress自定义程序具有页面编辑功能
- 自定义滑块-寻找额外功能的指导
- 未吊装的功能定义