持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
前言,知识回顾
上一章学习了变量提升的原理,先来回顾一下什么是变量提升
变量提升就是javascript代码在真正被执行前的解析阶段,会将所有的变量都放到一个叫vo的对象里,然后附上默认值为undefined 详情见重学javaScript (四)| 执行上下文栈和变量提升 - 掘金 (juejin.cn)这篇文章
我们今天来重点做几道题目巩固一下
来实践一下吧
- 第一题
console.log(a) // 打印什么呢
var a = 100
答案
解析
这个应该很简单,答案是undefined,因为var a = 100 在执行之前就已经被定义了,带着这个原理我门接着往下看
- 第二题
if (!("a" in window)) {
var a = 1
}
console.log(a) // 打印什么呢
答案
分析
- "a" in window是判断在全局作用域中存不存在a,若存在则为true,不存在为fasle
- 在es5中函数是没有块级作用域的,因此在if中定义的变量的作用域为包括此if语句的作用域,即变量a的作用域为全局作用域
- 在js执行过程中会先进行变量提升,因此在全局中先声明一个变量a
- if()的判断为false,因此不会a不会赋值
- 打印a为undefined
var a
if (!("a" in window)) { // true
a = 1;
}
console.log(a);//undefined
- 第三题
var a = 18
function d() {
console.log(a)
var a = { age: 19 }
console.log(a)
}
d() // 输出? console.log(a);
答案
解析 在访问变量时会先在访问的作用域进行查找
- 函数d在执行的时候,遇到var a = {age:19}时进行了变量提升,只声明没有赋值,因此第一个打印语句打印undefined
- 全局中的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