目录
前言
由于最近在准备蓝桥杯比赛,所以就想着做一下笔记,方便以后查看啦
考点
1.ES6考点
2.考题形式编辑
3.如何备考编辑
思考 var 关键字的缺点
1.变量提升机制的问题
2.变量重复声明的问题(待定)
3.非块作用域的问题
实验总结
最后
由于最近在准备蓝桥杯比赛,所以就想着做一下笔记,方便以后查看啦
还记得在 JavaScript 中我们学过定义变量的方式吗?
我们声明变量的唯一方式是使用 var
关键字,但其实使用 var
关键字定义变量会遇到一些麻烦,不知道同学们在开发代码时,是否遇到如下情景。
function getNumber(isNumber) {
if (isNumber) {
var num = "7";
} else {
var notNum = "not number!";
console.log(num);
}
}
getNumber(false);
我们在控制台可以看到以下报错:
很奇怪吧!我们明明在函数中定义了 num
变量,为什么会说没有定义呢?
其实在 JavaScript 中有一个提升机制,就是无论你在哪里使用 var
关键字声明变量,它都会被提升到当前作用域的顶部。在运行 getNumber
函数时,实际上执行结构是下面这个样子。
function getNumber(isNumber) {
var num;
var notNum;
if (isNumber) {
num = "7";
} else {
notNum = "not number!";
console.log(num);
}
}
getNumber(false);
因为在开头定义变量时,没有给
num
变量赋任何值,并且getNumber
传入的是false
,导致if
语句未执行,num
未被赋值,所以控制台输出 undefined。
我们知道使用 var
关键字声明的变量可以重复赋值,但在某些情况下会造成一些问题。例如下面的情景:
function Sum(arrList) {
var sum = 0;
for (var i = 0; i < arrList.length; i++) {
var arr = arrList[i];
for (var i = 0; i < arr.length; i++) {
sum += arr[i];
}
}
return sum;
}
var arr = [1, 2, 3, 4, 5];
document.write(Sum(arr));
如果在我们的环境中运行这段代码,环境会卡死。
这是因为在两层
for
循环中我们使用同一变量i
进行赋值时,代码在执行过程中,第二层的for
循环会覆盖外层变量i
的值。
使用 var
关键字定义的变量只有两种作用域,全局作用域和函数作用域,两者均不是块结构,会造成变量声明的提升。这可能出现下面这种问题:
function func() {
for (var i = 0; i < 5; i++) {}
document.write(i); // 5
}
func();
运行上述代码后,你会发现页面上会显示 5。我们虽然是在
for
循环中定义的i
变量,但由于变量被提升到for
语句之上,所以退出循环后,变量i
并没有被销毁,我们能够在循环外获取它的值。
本节实验为大家介绍了 let 和 const 关键字,同学们需要记住使用 const 关键字声明的是常量,必须赋初始值,并且不能在同一作用域内重新声明,也无法重新赋值。
我们来回顾一下 const、let、var 三者之间的区别:
- var 语句的作用域是函数作用域或者全局作用域;它没有块作用域,故不存在暂时死区;它可分配,也可重复性声明。
- let 语句属于块作用域,受到暂时死区的约束;它可分配,但不可重新声明。
- const 语句也属于块作用域,同样受到暂时死区的约束;它既不可重新分配,也不可重新声明。
感谢各位小伙伴的阅读,您的点赞与收藏,是我创作的动力与快乐!
文中内容来自于蓝桥杯官网,由本人整理而来.
欲知后事如何请听下回分解啦!