在学习阮一峰老师的《ES6标准入门》块级作用域与函数声明部分时,有一部分理解不通
// 浏览器的 ES6 环境
function f() { console.log('I am outside!'); }
(function () {
if (false) {
// 重复声明一次函数f
function f() { console.log('I am inside!'); }
}
f();
}());
// Uncaught TypeError: f is not a function
上面的例子实际运行的代码如下。
// 浏览器的 ES6 环境
function f() { console.log('I am outside!'); }
(function () {
var f = undefined;
if (false) {
function f() { console.log('I am inside!'); }
}
f();
}());
// Uncaught TypeError: f is not a function
f为什么会等于undefined?查了相关资料后结果如下:
当你在闭包内定义了一个f函数,即使他不被执行,但f在这里是作为全局变量,它覆盖了之前f函数的定义,所以在你后面调用f()的时候会显示未定义,如果把if那一段去掉就会有结果,或者把闭包内的f函数用let定义为一个局部变量