美文网首页
2、变量提升的原理

2、变量提升的原理

作者: 小碎步快跑 | 来源:发表于2024-02-22 21:38 被阅读0次

问题:以下代码会输出什么?

showName()
console.log(myname)
var myname = 'jack'
function showName() {
    console.log('函数showName被执行');
}
console.log(myname)

如果要了解为什么会存在变量提升就需要先了解下变量存在哪里,提升是什么意思?
答案是:代码在编译阶段,变量和函数会被存放到变量环境中,变量的默认值会被设置为 undefined;在代码执行阶段,JavaScript 引擎会从变量环境中去查找自定义的变量和函数。(就是存在变量环境中的意思,继续变量环境是啥)

首先javascript代码的执行过程是什么样的呢?一段 JavaScript 代码在执行之前需要被 JavaScript 引擎编译,编译完成之后,才会进入执行阶段。意思就是分两个阶段:编译,编译之后生个什么东西,执行

3.png

编译阶段

从上图可以看,经过编译后,会生成两部分内容:执行上下文(Execution context)和可执行代码

执行上下文是 :JavaScript 执行一段代码时的运行环境。比如调用一个函数,就会进入这个函数的执行上下文,在这个阶段中,执行上下文会分别创建变量对象,建立作用域链,以及确定this指向。

上下文.png

以上就说明:先编译生成执行上下文,执行上下文中有变量对象,变量就存在这个变量对象中

一、我们可以一行一行来分析代码,看看编译过程。

showName()
console.log(myname)
var myname = 'jack'
function showName() {
    console.log('函数showName被执行');
}
console.log(myname)

第 1 行和第 2 行,由于这两行代码不是声明操作,所以 JavaScript 引擎不会做任何处理;
第 3 行,由于这行是经过 var 声明的,因此 JavaScript 引擎将在环境对象中创建一个名为 myname 的属性,并使用 undefined 对其初始化;
第 4 行,JavaScript 引擎发现了一个通过 function 定义的函数,所以它将函数定义存储到堆 (HEAP)中,并在环境对象中创建一个 showName 的属性,然后将该属性值指向堆中函数的位置。如果变量与函数同名,则在这个阶段,以函数值为准。

经过编译阶段变量对象中是这样的:

// VO 为 Variable Object的缩写,即变量对象
VO = {
    myname : undefined,
   showName : <showName reference>  // 表示showName 的地址引用
}

执行阶段:

JavaScript 引擎开始执行“可执行代码”,按照顺序一行一行地执行。

showName()
console.log(myname)
var myname = 'jack'
function showName() {
    console.log('函数showName被执行');
}
console.log(myname)

我们可以一行一行来分析上述代码:(执行阶段):

第 1 行,调用函数showName能够在变量对象中找到 ,输出 '函数showName被执行';
第 2 行,查找到myname,根据编译阶段的结果,输出 undefined;
第 3行, 将myname 赋值为jack;
第 4-6行,这就是函数声明
第7行,查找到myname,经过第三行的操作,输出 'jack';

// 执行阶段
VO ->  AO   // Active Object
AO = {
    showName : <showName reference>,
    myname : 'jack',
    this: Window
}

练习:

    console.log(foo());
    function foo() {
        return 2;
    }
    var a;
    console.log(a);
    a = 1;

相关文章

  • 大前端—面试宝典—第一篇

    1. var的变量提升的底层原理是什么? JS引擎的工作方式是: 1) 先解析代码,获取所有被声明的变量; 2)然...

  • 浏览器学习笔记-JS执行

    变量提升 变量提升原理浏览器对js是先编译后执行,在编译过程中,js中的变量声明会被提升到代码段落前面。函数声明和...

  • js 变量提升的原理

    众所周知,JavaScript 中存在变量提升的问题,在 ES6 引入的新关键词 let 可以很方便的解决这个问题...

  • 刷前端面经笔记(三)

    1.var的变量提升的底层原理是什么? JS引擎的工作方式是1)先解析代码,获取所有被声明的变量;2)然后再执行。...

  • 2021-04-02

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

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

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

  • 变量提升练习题

    变量提升细节知识点 1.return 后面不进行变量提升,但是return下面的还是要变量提升2.重名变量不会重复...

  • 4.ECMAScript6(ES6)- let和const的特征

    变量提升问题不允许重复声明块级作用域 1、变量提升问题 (1)变量在提升之前就可以使用 (2)变量在提升之前不可以...

  • let const var 的区别

    1、let 和 const 定义的变量不会出现变量提升,而 var 定义的变量会提升2、let 和 const 会...

  • 闭包

    提升 1 变量提升 2 函数表达式 函数表达式的提升 === 变量提升 3 函数声明 demo 执行环境&词法作用...

网友评论

      本文标题:2、变量提升的原理

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