请问为什么不加严格模式会报
TypeError: f is not a function
非严格模式下是,变量会提升。实际上就是下面这样
var f;
f = function() {...}
(function() {
var f;
if (false) {
f = function() {...}
}
f();
} ())
但是严格模式下,变量不会提升:
let f = function() {...}
(function() {
if (false) {
let f = function() {...}
}
f()
} ())
但是在Gecko引擎中,非严格模式下也会报错,因为Gecko引擎遵守了另一个协议。
这就是条件式声明的典型问题。
条件式函数声明跟函数表达式的处理方式一样。因此,条件式函数声明丧失了函数声明提升的特性。
所以不建议在条件语句中定义变量。
13 回答12.6k 阅读
7 回答1.6k 阅读
3 回答1k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
2 回答1.8k 阅读
2 回答1k 阅读✓ 已解决
在非严格模式下, 你的代码等价于
自执行函数中, f的定义被提前, 离开了if代码块, 但赋值仍在if中, 所以到执行时f是undefined
在严格模式下, 你的代码等价于
内部f的定义也是在if中的, 所以f用的是外面的f