ES6 在附录B里面规定:
1.允许在块级作用域内声明函数。
2.函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
3.同时,函数声明还会提升到所在的块级作用域的头部。
console.log(a);
if(1){function a(){}};
console.log(a);
其实是
var a;
if(1){funcion a(){}}
此时执行到函数声明语句等同于赋值语句。
会将块级作用域的a赋值给全局变量a,也就是为什么在函数声明语句之前的改变会反应到全局变量,而函数声明语句之后的不会。
其实块级作用域里面的a和全局作用域的a还是区分开了的。
var a = 0;
if(true) {
a = 1;
function a() {};
a = 21;
}
---------------》》》
var a = 0;
var a; ==> 块级作用域的函数声明,见规定2
if(true){
var a = reference to function a(){} ;//函数声明提升,见规定3
a = 1;
function a(){} // 这条语句的行为变成了 a = a; 将块级作用域的a赋值给了全局变量a
a = 21;
console.log(a) // 21 块级作用域a 不影响全局变量a
}
console.log(a) // 很显然是1
在此对于这种笔试题,理解背后的道理就行了。
!!!实际编写代码的过程中,千万不要在块级作用域里面写函数声明。