1.let 使用
let 不会像 var一样存在变量提升的情况
"use strict"
function f(){
console.log(a);//undefined
var a=3;
}
f();
function f2(){
console.log(b)//报错,b未定义
let b=3;
}
f2();
函数内部有同名变量会让外部的变量失效,
var c=3
function f3(){
console.log(c);//内部有let 定义的变量,先把外部的c失效,然后,不存在变量提升,报错
let c=2;
}
代替立即执行函数
var config=(function(){
var config=[];
config.push(1);
config.push(2);
config.push(3);
config.push(4);
return config;
})()
let config2=[];
{
config2.push(1);
config2.push(2);
config2.push(3);
config2.push(4);
}
ES5中函数存在被提升,ES6中函数不会被提升
function f5(){
console.log(222)
}
function f6(){
f5();
if(false){
function f5(){
console.log(111)
}
}
}
f6();
如果使用严格模式,就是es6规范,不存在函数提升,那么打印结果为222;在es5中,存在函数提升,打印111
经典问题:
var arr=[];
for(var i=0;i<10;i++){
arr.push(function(){
console.log(i);
})
}
arr[2](); //打印10 ,如果想打印2 ,那么代码var i=0改为 let i=0;
改良2
var arr=[];
for(var i=0;i<10;i++){
arr.push((function(i){
return function(){
console.log(i);
}
})(i))
}
arr[2](); //其实就是一个闭包
2 .const使用
'use strict'
const a={
name:'jim'
}
let b={
}
//a=b; //报错,等于改变a的值了,实际中a是一个地址,可以改变地址指向的内容,但不改变a
a.age=23
Object.freeze(a);//加入改行后,a指向的对象也不能改变了
a.sex='male'//报错