var a = 0;if(true){a = 1;function a(){};a = 21;console.log(a);}console.log(a);// 21 1
当前上下文代码执行之前,会将带var/function的进行声明/定义。
当遇到“{}”时,新版浏览器和老版浏览器的处理不一致。
老版浏览器(IE10以下)忽略“{}”的影响,继续声明/定义,不存在块级作用域
新版浏览器中“{}”里的function只声明不定义,“{}”若出现funciton/let/const关键字,会创建一个块级上下文
本题在全局变量提升阶段会声明一个变量a,在块级作用域内的function a同样会声明,但是不定义。 代码继续执行
var a = 0;
在全局下给a赋值0。
if(true){a = 1;function a(){};a = 21;console.log(a);}
代码执行到条件判断时,创建一个块级作用域,在块级作用域内进行变量提升,声明并且定义funciton a。
a = 1;
块级作用域内给a赋值为1。
继续执行到函数定义的地方为了兼容ES3和ES6浏览器会做这样一步操作:
把代码之前所有对a的操作映射到全局
于时之前对块级作用域内变量a赋值为1的操作也会映射到全局的变量a,所以全局的a变成了1。所以最后控制台打印的是结果是21,和1,因为全局的a映射了。