哇!我终于毕业论文答辩完了,坐等毕业了,从此社会人,好兴奋!哈哈哈!
之前的时间都在忙工作和毕业论文,毕业设计的事情,没怎么写文章,五一补补!
一、块级作用域是什么?为什么要有块级作用域,解决了什么问题?
其实块级作用域很好理解,没那么高大上!大家都知道代码块,比如if(){}、while(){}等,{}大括号里边即为块级作用域。
在ES6之前是没有块级变量的,因此就会出现如下的情况:
- 循环变量的逃逸
什么意思呢?就是说一个for循环的变量i,在for循环结束之后依旧存在而不被销毁,详细看下面的代码:
for(var i = 0; i < 10; i++) {
}
console.log(i); //10
上面的代码for循环结束之后依旧输出i的值为10,而不是undefined,我们就说该变量逃逸出了for代码块,从而使变量i变成了全局变量,使用不慎会导致相关的安全问题。
其实在Java中也有指针逃逸的问题,指的是执行一个方法结束之后,相应的局部变量随着该方法传递到其他方法中去了,一般是在return中将变量返回了,更多知识,请自行谷哥。
二、let命令
let命令用于声明一个块级作用域变量,和传统的var变量不同,let变量只在声明的代码块中有效,出了代码块就找不到该变量了,如下面的代码:
{
let str = "hello world!"
console.log(str);
}
console.log(str);//ReferenceError: str is not defined
使用let的注意点:
- 1、变量必须先声明后使用;
- 2、不允许重复声明相同变量
针对第一点,看如下代码:
console.log(a);
let a = 9;
上面的代码会抛出一个ReferenceError,注意是error而不是undefined。
第二点:看如下代码:
{
let message = "";
let message = "message";
}
上面的代码会报SyntaxError,表示变量message已经定义了。
三、const命令
const命令用于创建一个常量,常量嘛!一旦创建就不能修改,任何想改变常量的值都会报错。但这也不是绝对的,下面会讲到为什么可以对一个常量进行修改。
由于常量的值声明之后不能修改,所以我们在声明常量的同时必须对其初始化。
首先JavaScirpt中有两种类型的常量,分别是:
- 1、基本类型常量
- 2、引用类型常量
对于基本类型的常量,一旦声明,就不可以改变,如修改下面的常量,将报错:
const i = 8;
i = 18; // VM745:2 Uncaught TypeError: Assignment to constant variable.
对于引用类型的常量,常量所指向的地址是不能改变的,但可以改变引用的成员属性,如:
const obj = {};
obj = {a:1} // error
// obj.name = "Mike" //OK
如果想要让引用类型的常量属性整体都不能增加、删除属性,可以使用Object.freeze方法。但是还有这样一种情况,当常量对象的某个键的值又是一个引用类型时,依旧还是可以对其进行修改的。要想彻底确定一个引用常量不能被修改,还需对其所有键值执行Object.freeze方法。
var constant = (obj) => {
Object.freeze(obj);
Object.keys(obj).forEach( (key,value) => {
if ( typeof obj[key] === 'object' ) {
constant(obj[key]); // 递归
}
});
};
使用const的注意点和使用let一样:
- 1、变量必须先声明后使用;
- 2、不允许重复声明相同变量
谢谢阅读!欢迎评论区留言讨论、交流!