- let所声明的变量只在代码块内有效,在for循环中使用let,每次都会新声明一个新的变量i
var a=[]
for (let i=0;i<10;i++){
a[i]=function(){
console.log(i);
}
}
此时:a[5]();//5
-
使用var声明变量,则是全局变量,所以全局中只有一个i变量,每次循环会更改i的值
var a=[]
for(var i=0;i<10;i++){
a[i]=function(){
console.log(i);
}
}
此时:a5;//10
* for循环语句是一个父作用域,for循环体内是一个单独的子作用域
for(let i=0;i<3;i++){
console.log(i)
}
//0 1 2
for(let i=0;i<3;i++){
i='abc'
console.log(i)
}
//abc abc abc
* var存在"变量提升",let不存在
即使用var时,变量可以在声明之前使用,使用let则不可以
//使用var
console.log(a); //输出 undefined
var a=2;
//使用let
console.log(b); //报错
let b=2;
* 区块中使用let或const命令时,在声明之前使用变量就会报错
var a=1;
if(true){
a=2; //报错
let a=3;
}
* let 在作用域内不允许重复声明变量
function(){
var a=1;
let a=1;// 报错
}
function(){
let b=1;
let b=2;//报错
}
* 在块级作用域中声明函数应该写成函数表达式,而不是函数声明语句(ES6中允许在块级作用域中声明函数)
//函数声明语句
{
let a='hello';
function f(){
return a;
}
}
//函数表达式
{
let a='hello'
let f= function (){
return a;
}
}