声明方式:
let:
1、只要后面有let声明,不管使用什么引用foo变量都会报错
2、ES6规范明确规定,如果代码块出现let、const声明,那么一旦形成了封闭作用域,在声明之前使用就会报错
3、不允许全局访问局部声明的变量/对象
const:
1、使用它声明之后,必须在声明的时候同时赋值
2、声明之后“不允许”更改存在的值,简而言之就是不允许修改内存地址
var str = "Hello World~!";
let str = "World~!";
console.log(str);
结果:Uncaught SyntaxError: Identifier 'str' has already been declared
解释:不能重复声明变量
-
ES6与ES5闭包的写法
//ES5写法 (function(){ console.log("a"); })(); //ES6写法 { console.log("b"); } { var a = 10; let b = 11; } console.log(a); console.log(b);
结果: 10
Uncaught ReferenceError: b is not defined
解释:{}对于ES6是闭包,对于ES5不是闭包
var arr = [];
for(var i = 0;i < 10;i++){//i++ 10
arr[i] = function(){
console.log(i);//这个console.log()这句代码在ES5中是没
有执行的
}
}
arr[6]();//在调用时,才去获取 i ,i此时已经是10
结果:10
解释:console.log()这句代码在ES5中是没有执行的
var arr = [];
for(let i = 0;i < 8;i++){//i++ 10
arr[i] = function(){
console.log(i);
}
}
arr[5]();//
结果:5
解释:console.log()这句代码在ES6中是是执行的
console.log(foo);
var foo = 2;
结果: undefined
解释: 这里会发生变量提升,也就是我们JS运行的时候,变量foo已经存在了,只是说没有赋值
console.log(bar);
let bar = 10;
结果: Cannot access 'bar' before initialization
解释: let不存在变量提升,所以在用到的时候,会抛出一个错误“bar is not defined”
var foo = 100;
if(true){
foo = "abc";
//在let声明变量"foo"之前,都属于变量“foo”的“死区”
let foo;
}
结果:Cannot access 'foo' before initialization
解释:ES6规范明确规定,如果代码块出现let、const声明,那么一旦形成了封闭作用域,在声明之前使用就会报错
//typeof检测变量类型
typeof foo;
let foo;
结果:Cannot access 'foo' before initialization
解释:只要后面有let声明,不管使用什么引用foo变量都会报错
function demo(num){
let num;
}
结果:Identifier 'num' has already been declared
解释: 这里使用let声明,同样属于重复声明变量,所
以会报错
![](https://img.haomeiwen.com/i19953917/66c91aaa857391d4.jpg)
网友评论