看完这篇你一定能弄懂块级作用域里的函数声明

803 阅读1分钟

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

在此对于这种笔试题,理解背后的道理就行了。

!!!实际编写代码的过程中,千万不要在块级作用域里面写函数声明。