重学javaScript (五)| 牛刀小试,变量提升

418 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

前言,知识回顾

上一章学习了变量提升的原理,先来回顾一下什么是变量提升

变量提升就是javascript代码在真正被执行前的解析阶段,会将所有的变量都放到一个叫vo的对象里,然后附上默认值为undefined 详情见重学javaScript (四)| 执行上下文栈和变量提升 - 掘金 (juejin.cn)这篇文章

我们今天来重点做几道题目巩固一下

来实践一下吧

  1. 第一题
console.log(a)  // 打印什么呢
var a =  100

答案

image.png

解析

这个应该很简单,答案是undefined,因为var a = 100 在执行之前就已经被定义了,带着这个原理我门接着往下看

  1. 第二题
if (!("a" in window)) {
    var a = 1
}
console.log(a) // 打印什么呢

答案

image.png

分析

  1. "a" in window是判断在全局作用域中存不存在a,若存在则为true,不存在为fasle
  2. 在es5中函数是没有块级作用域的,因此在if中定义的变量的作用域为包括此if语句的作用域,即变量a的作用域为全局作用域
  3. 在js执行过程中会先进行变量提升,因此在全局中先声明一个变量a
  4. if()的判断为false,因此不会a不会赋值
  5. 打印a为undefined
var a
if (!("a" in window)) { // true
 a = 1; 
} 
console.log(a);//undefined
  1. 第三题
    var a = 18
    function d() {
        console.log(a)
        var a = { age: 19 }
        console.log(a)
    }
   d() // 输出? console.log(a);

答案

image.png

解析 在访问变量时会先在访问的作用域进行查找

  1. 函数d在执行的时候,遇到var a = {age:19}时进行了变量提升,只声明没有赋值,因此第一个打印语句打印undefined
  2. 全局中的a在全局中查找,打印18
//相当于
var a 
a = 18;
function d() {
  var a 
  console.log(a);//undefiend
  a = { age: 19};
  console.log(a); //{ age: 19};
}
d();  //  输出?
console.log(a);//18