JavaScript中用let语句声明作用域的用法讲解
语法
letvariable1=value1
参数
variable1
要声明的变量的名称。
value1
赋给变量的初始值。
备注
使用let语句声明一个变量,该变量的范围限于声明它的块中。 可以在声明变量时为变量赋值,也可以稍后在脚本中给变量赋值。
使用let声明的变量,在声明前无法使用,否则将会导致错误。
如果未在let语句中初始化您的变量,则将自动为其分配JavaScript值undefined。
示例:
varl=10;
{
letl=2;
//Atthispoint,l=2.
}
//Atthispoint,l=10.
//Additionalwaystodeclareavariableusinglet.
letindex;
letname="ThomasJefferson";
letanswer=42,counter,numpages=10;
letmyarray=newArray();
块级作用域
for(vari=0;i<10;i++){}
console.log(i);//10
for(letj=0;j<10;j++){}
console.log(j);//"ReferenceError:jisnotdefined
不存在变量提升
console.log(a);//输出undefined console.log(b);//报错ReferenceError console.log(c);//报错ReferenceError vara=2; letb=2;
注意区别undefined和ReferenceError
暂时性死区(TDZ)
只要进入当前块级作用域,所使用的变量已经存在了,但在声明之前都属于死区,不可进行操作。
注意:typeof不再是100%安全的操作
typeofx;//ReferenceError typeofy//undefined letx;
不允许重复声明
letx=1; letx;//"SyntaxError:Identifier'x'hasalreadybeendeclared vary=2; vary=3;//y=3
块级作用域
//匿名函数写法
(function(){
vartmp=...;
...
}());
//块级作用域写法
{
lettmp=...;
...
}
ES5的严格模式规定,函数只能在顶层作用域和函数内声明,其他情况(比如if代码块、循环代码块)的声明都会报错。
//ES5
'usestrict';
if(true){
functionf(){}//报错
}
ES6由于引入了块级作用域,这种情况可以理解成函数在块级作用域内声明,因此不报错,但是构成区块的大括号不能少
//报错
'usestrict';
if(true)
functionf(){}
声明的全局变量不再是window的属性
"usestrict"; vara=1; console.log(window.a)//1 letb=1; console.log(window.b)//undefined