【转】if语句内的function声明会不会被提前?

前面的答案里很多人都说 IIFE 里的函数声明不会提前,这是不对的。比如说这样:

(function() {
  if (g()) {
    console.log('OK');
  }
  function g() { return true; }
})()

所以无所谓 IIFE,只要是函数作用域声明都会提前,IIFE 也是函数,无非就是定义之后立刻执行而已。

真正的问题在于原题中的 function g() {...} 生命在 if 语句内部。在 strict mode 出现之前,if 语句(以及其他条件语句所创造的代码块内)内部的函数声明是否会提前是没有一致性的,不同的浏览器会做出不同的解释,所以最佳实践的代码规范都会要求不要在这里面声明和定义函数。

直到 strict mode 出现之后,明确规定了在此种情形下的函数声明会抛出错误,所以现在写代码都会约定遵循严格模式以避免这些问题。

另外 ES6 模块缺省就是严格模式的,也就是跟上语言的发展潮流是上策,不要再和以前那些不完善的坑做无谓的周旋了。

参考文章:
if语句内的function声明会不会被提前?

此条目发表在JavaScript分类目录。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。 必填项已用*标注