请问 js 非严格模式下报错 f is not a function

clipboard.png

请问为什么不加严格模式会报
TypeError: f is not a function

阅读 2.8k
2 个回答

在非严格模式下, 你的代码等价于

var f
f = function() {...}
(function() {
  var f
  if (false) {
    f = function() {...}
  }
  f()
} ())

自执行函数中, f的定义被提前, 离开了if代码块, 但赋值仍在if中, 所以到执行时f是undefined

在严格模式下, 你的代码等价于

let f
f = function() {...}
(function() {
  if (false) {
    let f
    f = function() {...}
  }
  f()
} ())

内部f的定义也是在if中的, 所以f用的是外面的f

非严格模式下是,变量会提升。实际上就是下面这样

var f;
f = function() {...}
(function() {
  var f;
  if (false) {
    f = function() {...}
  }
  f();
} ())

但是严格模式下,变量不会提升:

let f = function() {...}
(function() {
  if (false) {    
    let f = function() {...}
  }
  f()
} ())

但是在Gecko引擎中,非严格模式下也会报错,因为Gecko引擎遵守了另一个协议。
这就是条件式声明的典型问题。
条件式函数声明跟函数表达式的处理方式一样。因此,条件式函数声明丧失了函数声明提升的特性。
所以不建议在条件语句中定义变量。

推荐问题