变量提升的题目
变量提升
先说三句总结性的话:
let 的「创建」过程被提升了,但是初始化没有提升。
var 的「创建」和「初始化」都被提升了。
function 的「创建」「初始化」和「赋值」都被提升了。
变量提升的规律
在进入一个执行上下文后,先把 var 和 function 声明的变量前置,再去顺序执行代码。
PS:作用域分为全局作用域和函数作用域,用var声明的变量,只在自己所在的所用域有效。
我们举例来看看下面的代码。
代码 1:
console.log(fn); |
相当于:
var fn = undefined; |
打印结果:
代码 2:
console.log(i); |
相当于:
var i = undefined; |
打印结果:
代码 3:
var a = 1; |
相当于:
var a = undefined; |
打印结果:
参考链接:https://github.com/jirengu/javascript-tutorial
声明时的重名问题
假设a
被声明为变量,紧接着a
又被声明为函数,原则是:声明会被覆盖(先来后到,就近原则)。
PS:
如果
a
已经有值,再用 var 声明是无效的。如果
a
已经有值,紧接着又被赋值,则赋值会被覆盖。
举例1:
var fn; //fn被声明为变量 |
举例2:
function fn() {} //fn被声明为function,且此时fn已经被赋值,这个值就是function的对象 |
既然再var无效,但是再function,是有效的:
function fn() {} //fn被声明为function,且此时fn已经有值,这个值就是function的对象 |
打印结果:
函数作用域中的变量提升(两点提醒)
提醒1:
在函数作用域也有声明提前的特性:
使用var关键字声明的变量,是在函数作用域内有效,而且会在函数中所有的代码执行之前被声明
函数声明也会在函数中所有的代码执行之前执行
因此,在函数中,没有var声明的变量都会成为全局变量,而且并不会提前声明。
举例1:
var a = 1; |
上方代码中,foo()的打印结果是1
。如果去掉第一行代码,打印结果是Uncaught ReferenceError: a is not defined
提醒2:定义形参就相当于在函数作用域中声明了变量。
|
其他题目
20180321面试题:
var a = 1; |
打印结果:
1 |
上方代码中,不存在块级作用域的概念。if语句中用var定义的变量,让然是全局变量。
顺便延伸一下,用let定义的变量,是在块级作用域内有效。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 传礼!
评论
ValineGitalk