码迷,mamicode.com
首页 > 编程语言 > 详细

javaScript 变量提升 var let const,以及JS 的解析阶段和执行阶段

时间:2018-03-05 12:52:20      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:es6   let   not   bsp   post   关于   test   详解   log   

我们先来看一道面试题,大家猜想一下,下面这段代码,打印出来的结果是什么

var name = ‘World!‘;
(function () {
    if (typeof name === ‘undefined‘) {
        var name = ‘Jack‘;
        console.log(‘Goodbye ‘ + name);
    } else {
        console.log(‘Hello ‘ + name);
    }
})(); 

这里打印出来的结果为什么是 Goodbye Jack, 而不是Hello World呢。

因为JS代码运行分为两个阶段:解析阶段和执行阶段

解析阶段:找到所有的声明,包括函数声明和var声明,并把声明操作提升到它所在执行环境的顶部(全局或者函数内),而赋值和逻辑操作则会被留在原地等待代码执行。

                   并且,当它发现了函数名与函数名或者函数名与变量名冲突的时候,处理原则是:‘处理函数声明冲突时会覆盖,处理变量声明时冲突会忽略’。(后面再详解)

 

经过解析阶段之后,我们的代码其实被解析成了这样:

var name = ‘World!‘;
(function () {
        var name; // 对变量name的声明会被提升到函数的顶部,并且局部的变量name会覆盖全局的变量name
    if (typeof name === ‘undefined‘) {
        name = ‘Jack‘;
        console.log(‘Goodbye ‘ + name);
    } else {
        console.log(‘Hello ‘ + name);
    }
})(); 

 

执行阶段:赋值和逻辑操作就会被放在执行阶段。所以当我们在执行阶段时,由于name变量的声明被提升了,在if内判断typeof name的时候,赋值操作(即name=‘Jack‘)还未执行,所以  typeof name === ‘undefined‘  判断结果为true,打印出来的结果就是‘GoodBye Jack’。

 

而在ES6中新规范中的 let,const 会不会执行变量提升呢? 我做了这么一个小实验

(function () {
    console.log(i); // undefined
    var i = ‘test const‘;
})(); 
(function () {
    console.log(i);  // ReferenceError: i is not defined
    let i = 0;
})();
  
(function () {
    console.log(i); // ReferenceError: i is not defined
    const i = ‘test const‘;
})();

可以看到 let 和const 声明的变量是不会被提升的,这也是为什么一开始的时候我把字体标红:函数声明和var声明会被提升。

 

关于js的解析和执行阶段的补充详解,将在下一篇博客中讲解

javaScript 变量提升 var let const,以及JS 的解析阶段和执行阶段

标签:es6   let   not   bsp   post   关于   test   详解   log   

原文地址:https://www.cnblogs.com/daisygogogo/p/8508320.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!