以下代码输出什么
var a = 0
if (true) {
a = 1;
function a() {
}
a = 21;
console.log(a)
}
console.log(a)
变量提升:当前上下文代码执行之前,会把 var/function声明或者定义,带var的只声明 带function声明+定义 如果遇到了{} 新老浏 览器表现不一致( 兼容ES3、 兼容ES6) IE浏览器<=1E10〕
不管{},还是一如既往的function声明+定 义,而且也不会存在块级作用域
【新版本浏览器】 {}中的function,在全局下只声明不在定义 {}中出现的function/let/const会创建一个 块级上下文
看图
分析如下
- 首先变量提升:var a;function a;
- 遇到if条件为true创建块级作用域 函数提升 function a(){} 其中块级a表示一个函数堆
- a=1;修改块级a 为1、全局也为1
- function a(){},会把代码之前的对a的操作映射给全局一份、后面就不会在处理、认为后面全是私有的
- a = 21 修改块级变量a =21, 不在修改全局
所以if里面的a 输出21 ,最外层的a输出1