转载自:http://blog.sina.com.cn/s/blog_77f241790102vqyf.html
在很多语言中都有块级作用域,但JS没有,它使用var 声明变量,以function来划分作用域,大括号{}却限定不了var的作用域。用var声明的变量具有变量提升(declaration hoisting)的效果
ES6里增加了let,可以在{},if ,for里声明。用法同var ,但作用域限定在块级,let声明的变量不存在变量提升。
一、let命令
示例1:{}块
{
let a =10;
var b=1;
}
console.log(a) // ModuleEvaluationError: a is ont defined
console.log(b) //1
上面的代码在代码块之中,分别用let和var声明了两个变量。然后在代码块之外调用了这两个变量,结果let声明报错,var 声明的变量返回了正确的值。这表明,let声明的变量只在它所在的代码块有效。
示例2:if
function getVal(boo){
if(boo){
let val = ‘red‘;
return val
}else{
// 这里访问不到val
return null;
}
// 这里也访问不到val
}
示例3:块级作用域for
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); //10
// 上面的代码用var 最后输出是10
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); //6
// 上面代码用let,声明的变量公在块级作用域内有效,最后输出6
示例四:变量提升(先使用后声明)
function func(){
// val先使用后声明,不报错
alert(val);
var val;
}
变量val先使用后声明,输出undefined ,也不报错
这也意味着typeof不再是一个百分之百的安全操作
ES6规定,如果代码块中存有let,这个区块一开始就形成了封闭作用域。凡是在声明之前就使用,就会报错。
即在代码块内,在let声明之前使用变量都是不可用的。语法上有个术语叫“暂时性死区”,简称TDZ。
当然TDZ并没有出现在ES规范里,它只是用来形象的描述。
let 注意事项
1、不能重复声明
// var 和 let重复声明
var name = "linyufei";
let name = "mvp";
// 两个let重复声明
let age = 24;
let age = 30;
执行时报语法错误 (注: 在firefox中调试,不存在报错现象)
2、有了let后,匿名函数自执行就可以去掉了
// 匿名函数写法
(functoin(){
var jQuery = function(){};
window.$ = jQuery;
})()
// 块级作用或写法
{
let jQuery = function (){};
window.$ = jQuery;
}
二、const命令
const也用来声明变量,但是声明的是常量。一旦声明,常量的值就不能改变。
const PI = 3.1415;
PI = 4;
// 提示PI is read-only;