施小喵

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
转载自: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;
posted on 2015-09-22 11:57  施小喵  阅读(208)  评论(0编辑  收藏  举报