var a = 0 if (true) {a = 1; function a() {} a = 21; console.log(a) }js基础知识

292 阅读1分钟

以下代码输出什么

 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会创建一个 块级上下文

看图

image.png

分析如下

  • 首先变量提升: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