美文网首页
变量提升

变量提升

作者: _1633_ | 来源:发表于2020-06-06 16:30 被阅读0次

首先我们看一段代码的执行

1

这段代码的输出是 undefined, 为什么它会是 undefined ,而不是 a is not defined,这就跟 JS 的运行机制有关。


JS 中的 声明 和 赋值

    对于简单的  var a = 1 声明语句,我们可以理解为两个步骤:

        1 声明部分: var a;

        2 赋值部分: a = 1;

    那么 函数的 声明 和 赋值 又是如何的

2

        对于 foo 函数 是一个完整的函数声明没有涉及到 赋值操作; 而第二个函数 先声明了 变量 bar ,再将 函数 赋值给 bar。


再谈变量提升

    理解了 声明 和 赋值,那么 什么是 变量提升

        变量提升,是指在 JavaScript 代码执⾏过程中,JavaScript 引擎把变量的声明部分和函数的声明部 分提升到代码开头的“行为”。变量被提升后,会给变量设置默认值,这个默认值就是我们熟悉的 undefined。 

    也就是说 对于 var a = 1,可以理解为两步:

        1  var a = undefined;

        2  a = 1;

        注意 : 只有 声明本身 会被提升,而 赋值或其他运行逻辑 会留在原地。

3

    注意: 在每个作用域中,都会进行提升操作,比如 在函数 作用域内 用 var 声明的,会提升至 本作用域 的开头。


再谈 var a = 1

    JS 在执行 var a = 1 这段代码时,变量 和 函数声明 在代码里的位置是不会改变的,而是在编译 阶段被JavaScript引擎放入内存中 。一段 JS 代码在执行前 需要被 JS 引擎 编译,编译完成之后 才会进入 执行阶段

    一段 JS 代码  --------->   编译阶段   --------->   执行阶段

    这意味着无论作用域中的声明出现在什么地方,都将在代码本身被执行前首先进行处理。 可以将这个过程形象地想象成所有的声明(变量和函数)都会被“移动”到各自作用域的 最顶端,这个过程被称为提升

    声明本身会被提升,而包括函数表达式的赋值在内的赋值操作并不会提升。

 编译阶段 

        还是上面的 例子

4

    一段 JS 代码 经过 编译阶段后 会生成 两部分:执行上下文 和  可执行代码

5

    执行上下文 是 JS 执行一段代码时的 运行环境, 它存在 一个变量环境对象,这个对象保存了 变量提升部分的内容,比如上面例子中的 变量 a 和 函数 foo。

    分析 图4 中的代码:

        1 第一行和第二行 不是声明操作, JS 引擎不处理。

        2 第三行 是 一个 var 的声明变量, JS 引擎会在环境对象中 创建一个 名为 a 的 属性,并初始化值 undefined

        3 第四行 是函数声明语句, JS 引擎 会在环境对象中 创建一个 名为 foo的 属性, 并将函数定义存储到 堆中,属性值 指向 函数所在堆的地址。

    这样 就生成了 变量环境对象。

执行阶段

    在执行阶段, JS 引擎就会处理 执行阶段的代码,JS 引擎 就会在 变量环境对象 中 找到 所需要的值,并输出结果。


总结

    JS 代码在执行过程中,会经过两个阶段 : 编译阶段 执行阶段

    在编译阶段,变量和函数会被存放到 变量环境 中,变量的默认值会被设置为 undefined;在执行阶段,JavaScript 引擎会从变量环境中去查找⾃定义的变量和函数。

相关文章

  • 浅析关于 JS 作用域的几个高频知识点

    闭包 词法作用域 变量提升 变量提升 什么是变量提升 顾名思义,变量提升指的是,在声明变量的时候,变量的声明位置会...

  • JS中的提升

    JS中包含两种提升,变量提升和函数提升。 变量提升 变量提升只能是var或者function声明的变量或者函数,l...

  • 变量提升问题

    这是 变量提升问题 1. 变量提升, 很简单,就是把变量提升提到函数的top的地方。我们需要说明的是,变量提升 只...

  • JavaScript__变量声明提升(Hoisting)

    摘取:http://www.jb51.net/article/30719.htm 变量提升 变量提升就是把变量提升...

  • var,let,const 的区别

    变量提升 变量提升即将变量声明提升到它所在作用域最前面,而且仅仅是提升变量,不会提升所赋的值 执行流程 作用域 在...

  • 执行上下文和执行上下文栈

    一、变量提升和函数提升 首先回顾一下什么是变量提升。 变量声明提升,通过var定义(声明)的变量,在定义语句之前就...

  • let const var

    变量提升 函数会优先于变量提升; 函数提升会把整个函数移到作用域顶部 变量提升智慧把变量的定义移到作用域顶部 wi...

  • 2021-04-02

    变量提升和函数提升以及他们的优先级 1,变量提升:变量提升是指将变量声明提升到它所在的作用域的最开始部分 2,函数...

  • 关于变量提升

    函数提升的优先级要高于变量提升,变量提升到函数声明的后面; 变量提升,但是赋值不提升,函数表达式不提升;

  • Javascript 变量执行过程 和 数组 & 对象的区别

    变量提升 JS执行过程1. 先提升(先提升函数,再提升变量,如果名字一样,变量提升会覆盖函数提升)2. 再执行,如...

网友评论

      本文标题:变量提升

      本文链接:https://www.haomeiwen.com/subject/vthooctx.html