请教 js 变量提升、函数提升问题 ?

<script>
  var a = 0;
  
  if (true) {
    a = 1;
    function a() { };
    a = 5;
    console.log(a);  // 5
  }

  console.log(a);  // 1
</script>

各位大佬,请教:

代码如上,请问这个代码怎么解释为好呢,
里面的为什么返回的是 5
外边的为什么返回的是 1

阅读 2.6k
3 个回答

首先弄清三点

  1. 变量提升指的是当前上下文代码执行前,会把var/function声明或者定义,带var的只声明,带function的声明+定义
  2. 条件判断下的变量提升机制:在当前作用域下不管条件是否成立都要进行变量提升 ,function在老版本浏览器(IE10以下)的渲染机制下,声明和定义都处理,但是为了迎合es6中的块作用域,新版本浏览器对于在条件判断中的function不管条件是否成立,都只是先声明,没有定义 类似于var ,同时判断体中如果出现了let、const、function会创建一个新的执行上下文即块级上下文
  3. 当判断条件成立,进入到判断体中,第一件事并不是代码执行,而是类似于变量提升,先把fn声明和定义了(在ES6中他是块级作用域)

遇到这种类型的问题,画图是最好的解决办法
image

断点调试看一下

image

此时全局的a是0

image

当function a(){}执行完成后,此时可以看到全局的a已经变成了1

image

全局作用域和局部作用域

全局作用域:整个JS执行环境
局部作用域:通过创建一个函数就开辟出了一个局部作用域

全局变量和 局部变量

全局变量:在全局作用域都可以访问的变量
局部变量:只能在当前局部作用域访问的

变量声明提升:

如果变量声明在函数里面,则将变量声明提升到函数的开头

如果变量声明是一个全局变量,则将变量声明提升到全局作用域的开头

变量运行(搜索)机制:

首先看,有没有局部作用域
如果有,查找是不是这个局部作用域定义的变量
如果不是,寻找上一级作用域,直到找到全局作用域
如果全局作用域也找不到这个变量,这个变量就是未定义的 undefined

image.png
到17行的时候 块级的块级的a=1 全局的a=1 所以最后 打印的是1 里面 的是5你应该可以理解 的!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏