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 相关文章推荐
javascript 出生日期和身份证判断大全
Nov 13 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
Jul 31 Javascript
javascript获取web应用根目录的方法
Feb 12 Javascript
js replace替换所有匹配的字符串
Feb 13 Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
Nov 28 Javascript
jQuery实现返回顶部功能
Feb 23 Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
Aug 20 Javascript
JavaScript高仿支付宝倒计时页面及代码实现
Oct 21 Javascript
简单谈谈原生js的math对象
Jun 27 Javascript
vue实现仿淘宝结账页面实例代码
Nov 08 Javascript
vue组件传递对象中实现单向绑定的示例
Feb 28 Javascript
Vue-component全局注册实例
Sep 06 Javascript
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
解决php中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
php设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
使用PHP如何实现高效安全的ftp服务器(二)
2015/12/30 PHP
PHP会话控制实例分析
2016/12/24 PHP
PHP递归的三种常用方式
2019/02/28 PHP
Display SQL Server Login Mode
2007/06/21 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
javascript实现设置、获取和删除Cookie的方法
2015/06/01 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
使用nodejs下载风景壁纸
2017/02/05 NodeJs
详解微信小程序 相对定位和绝对定位
2017/05/11 Javascript
vue-router实现webApp切换页面动画效果代码
2017/05/25 Javascript
了解VUE的render函数的使用
2017/06/08 Javascript
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
2020/02/12 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
2020/03/07 Javascript
js+for循环实现字符串自动转义的代码(把后面的字符替换前面的字符)
2020/12/24 Javascript
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
Python使用urllib模块的urlopen超时问题解决方法
2014/11/08 Python
python编写暴力破解FTP密码小工具
2014/11/19 Python
在Django的模型和公用函数中使用惰性翻译对象
2015/07/27 Python
zookeeper python接口实例详解
2018/01/18 Python
python 遍历目录(包括子目录)下所有文件的实例
2018/07/11 Python
python导入坐标点的具体操作
2019/05/10 Python
Django外键(ForeignKey)操作以及related_name的作用详解
2019/07/29 Python
基于python实现复制文件并重命名
2020/09/16 Python
python smtplib发送多个email联系人的实现
2020/10/09 Python
Hotels.com印度:酒店预订
2019/05/11 全球购物
自我检讨书怎么写
2015/05/07 职场文书
民事代理词范文
2015/05/25 职场文书
人事任命书范本
2015/09/21 职场文书
教师师德承诺书2016
2016/03/25 职场文书
pytorch 6 batch_train 批训练操作
2021/05/28 Python