ECMAScript6块级作用域及新变量声明(let)


Posted in Javascript onJune 12, 2015

很多语言中都有块级作用域,但JS没有,它使用var声明变量,以function来划分作用域,大括号“{}” 却限定不了var的作用域。用var声明的变量具有变量提升(declaration hoisting)的效果。

ES6里增加了一个let,可以在{}, if, for里声明。用法同var,但作用域限定在块级,let声明的变量不存在变量提升。

示例1: 块级作用域 if

function getVal(boo) {
  if (boo) {
    var val = 'red'
    // ...
    return val
  } else {
    // 这里可以访问 val
    return null
  }
  // 这里也可以访问 val
}

变量val在if块里声明的,但在else块和if外都可以访问到val。

把var换成let,就变成这样了

function getVal(boo) {
  if (boo) {
    let val = 'red'
    // ...
    return val
  } else {
    // 这里访问不到 val
    return null
  }
  // 这里也访问不到 val
} 

示例2: 块级作用域 for

function func(arr) {
  for (var i = 0; i < arr.length; i++) {
    // i ...
  }
  // 这里也可以访问到i
}

变量i在for块里声明的,但在for外也能访问到。

把var换成let,for外就访问不了i

function func(arr) {
  for (let i = 0; i < arr.length; i++) {
    // i ...
  }
  // 这里访问不到i
}

示例3: 变量提升(先使用后声明)

function func() {
  // val先使用后声明,不报错
  alert(val) // undefined
  var val;
}

变量val先使用后声明,输出undefined,也不报错。

把var换成let,就报错了

function func() {
  // val先使用后声明,报语法错
  alert(val)
  let val;
} 

示例4: 变量提升(先判断后声明)

function func() {
  if (typeof val == 'undefined') {
    // ...
  }
  var val = ''
}

使用typeof判断时也可以再var语句的前面

但把var换成let,if处报语法错

function func() {
  if (typeof val == 'undefined') {
    // ...
  }
  let val = '';
}

ES6规定,如果代码块中存在let,这个区块从一开始就形成了封闭作用域。凡是在声明之前就使用,就会报错。即在代码块内,在let声明之前使用变量都是不可用的。语法上有个术语叫“暂时性死区”(temporal dead zone),简称TDZ。当然TDZ并没有出现在ES规范里,它只是用来形象的描述。

let的注意事项

1. 不能重复声明

// var和let重复声明
var name = 'Jack';
let name = 'John';
 
// 两个let重复声明
let age = 24;
let age = 30;

执行时报语法错

2. 有了let后,匿名函数自执行就可以去掉了

// 匿名函数写法
(function () {
 var jQuery = function() {};
 // ...
 window.$ = jQuery
})();
 
// 块级作用域写法
{
 let jQuery = function() {};
 // ...
 window.$ = jQuery;
}

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
javscript对象原型的一些看法
Sep 19 Javascript
初窥JQuery(二) 事件机制(1)
Nov 25 Javascript
Prototype源码浅析 String部分(三)之HTML字符串处理
Jan 15 Javascript
window.open以post方式将内容提交到新窗口
Dec 26 Javascript
js实现的牛顿摆效果
Mar 31 Javascript
ECMAScript6函数默认参数
Jun 12 Javascript
详解Node.js如何开发命令行工具
Aug 14 Javascript
工厂模式在JS中的实践
Jan 18 Javascript
浅谈Vue.use到底是什么鬼
Jan 21 Javascript
Webpack中SplitChunksPlugin 配置参数详解
Mar 24 Javascript
详解Webpack抽离第三方类库以及common解决方案
Mar 30 Javascript
详解vue 组件注册
Nov 20 Vue.js
JavaScript中的toDateString()方法使用详解
Jun 12 #Javascript
ECMAScript6新增值比较函数Object.is
Jun 12 #Javascript
ECMAScript6函数剩余参数(Rest Parameters)
Jun 12 #Javascript
ECMAScript6函数默认参数
Jun 12 #Javascript
在JavaScript中操作时间之setYear()方法的使用
Jun 12 #Javascript
简介JavaScript中setUTCSeconds()方法的使用
Jun 12 #Javascript
JS中产生标识符方式的演变
Jun 12 #Javascript
You might like
雄兵连:天使彦天使彦为爱折翼,彦和炙心同时念动的誓言!
2020/03/02 国漫
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
PHP数据库连接mysql与mysqli对比分析
2016/01/04 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
php和vue配合使用技巧和方法
2019/05/09 PHP
laravel 执行迁移回滚示例
2019/10/23 PHP
jQuery创建自己的插件(自定义插件)的方法
2010/06/10 Javascript
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
2013/10/14 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
JS实现将数字金额转换为大写人民币汉字的方法
2016/08/02 Javascript
BootStrap 可编辑表Table格
2016/11/24 Javascript
js 原型对象和原型链理解
2017/02/09 Javascript
JS验证不重复验证码
2017/02/10 Javascript
vue之nextTick全面解析
2017/05/17 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
2017/06/21 Javascript
解决canvas画布使用fillRect()时高度出现双倍效果的问题
2017/08/03 Javascript
浅谈Vue.js中ref ($refs)用法举例总结
2017/12/19 Javascript
js实现时间日期校验
2020/05/26 Javascript
[02:16]完美世界DOTA2联赛PWL S3 集锦第三期
2020/12/21 DOTA
Python实现屏幕截图的代码及函数详解
2016/10/01 Python
go和python变量赋值遇到的一个问题
2017/08/31 Python
Python 反转字符串(reverse)的方法小结
2018/02/20 Python
python使用Matplotlib绘制分段函数
2018/09/25 Python
Django 实现购物车功能的示例代码
2018/10/08 Python
python实现简单学生信息管理系统
2020/04/09 Python
Python中如何添加自定义模块
2020/06/09 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
使用CSS3编写灰阶滤镜来制作黑白照片效果的方法
2016/05/09 HTML / CSS
CK美国官网:Calvin Klein
2016/08/26 全球购物
全球领先的各类汽车配件零售商:Advance Auto Parts
2016/08/26 全球购物
个人贷款授权委托书样本
2014/10/07 职场文书
如何用PHP实现多线程编程
2021/05/26 PHP
mysql中如何用命令创建联合唯一索引
2022/04/20 MySQL