哇!我终于毕业论文答辩完了,坐等毕业了,今后社会人,好兴奋!哈哈哈!安全
以前的时间都在忙工做和毕业论文,毕业设计的事情,没怎么写文章,五一补补!bash
其实块级做用域很好理解,没那么高大上!你们都知道代码块
,好比if(){}
、while(){}
等,{}
大括号里边即为块级做用域。ui
在ES6以前是没有块级变量的,所以就会出现以下的状况:spa
什么意思呢?就是说一个for
循环的变量i
,在for
循环结束以后依旧存在而不被销毁,详细看下面的代码:设计
for(var i = 0; i < 10; i++) {
}
console.log(i); //10
复制代码
上面的代码for
循环结束以后依旧输出i
的值为10,而不是undefined
,咱们就说该变量逃逸出了for
代码块,从而使变量i
变成了全局变量,使用不慎会致使相关的安全问题。指针
其实在Java
中也有指针逃逸的问题,指的是执行一个方法结束以后,相应的局部变量随着该方法传递到其余方法中去了,通常是在return
中将变量返回了,更多知识,请自行谷哥。code
let
命令let
命令用于声明一个块级做用域变量,和传统的var
变量不一样,let
变量只在声明的代码块中有效,出了代码块就找不到该变量了,以下面的代码:对象
{
let str = "hello world!"
console.log(str);
}
console.log(str);//ReferenceError: str is not defined
复制代码
使用let
的注意点:递归
针对第一点,看以下代码:ci
console.log(a);
let a = 9;
复制代码
上面的代码会抛出一个ReferenceError
,注意是error
而不是undefined
。 第二点:看以下代码:
{
let message = "";
let message = "message";
}
复制代码
上面的代码会报SyntaxError
,表示变量message
已经定义了。
const
命令const
命令用于建立一个常量,常量嘛!一旦建立就不能修改,任何想改变常量的值都会报错。但这也不是绝对的,下面会讲到为何能够对一个常量进行修改。
因为常量的值声明以后不能修改,因此咱们在声明常量的同时必须对其初始化。
首先JavaScirpt
中有两种类型的常量,分别是:
对于基本类型的常量,一旦声明,就不能够改变,如修改下面的常量,将报错:
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
同样:
谢谢阅读!欢迎评论区留言讨论、交流!