码迷,mamicode.com
首页 > 其他好文 > 详细

ecma6块级作用域

时间:2015-09-22 12:52:06      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

转载自: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;

ecma6块级作用域

标签:

原文地址:http://www.cnblogs.com/shixiaomiao/p/4828527.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!