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 DOM 学习第五章 表单简介
Feb 19 Javascript
replace()方法查找字符使用示例
Oct 28 Javascript
jQuery获取动态生成的元素示例
Jun 15 Javascript
JavaScript资源预加载组件和滑屏组件的使用推荐
Mar 10 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
Aug 13 Javascript
浅谈Javascript中的12种DOM节点类型
Aug 19 Javascript
js实现表单提交后不重新刷新当前页面
Nov 30 Javascript
微信小程序 页面跳转和数据传递实例详解
Jan 19 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
Jun 16 Javascript
Angular Renderer (渲染器)的具体使用
May 03 Javascript
Taro小程序自定义顶部导航栏功能的实现
Dec 17 Javascript
前端监听websocket消息并实时弹出(实例代码)
Nov 27 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+XML 制作简单的留言本 图文教程
2009/11/02 PHP
PHP获取MAC地址的具体实例
2013/12/13 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
2015/10/27 PHP
PHP isset()与empty()的使用区别详解
2017/02/10 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
2019/04/02 PHP
js 字符串转换成数字的三种方法
2013/03/23 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
coffeescript使用的方式汇总
2015/08/05 Javascript
JavaScript必知必会(十) call apply bind的用法说明
2016/06/08 Javascript
JavaScript实现简单评论功能
2017/08/17 Javascript
jQuery中 DOM节点操作方法大全
2017/10/12 jQuery
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
2019/09/06 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
2019/09/12 Javascript
Vue+element-ui添加自定义右键菜单的方法示例
2020/12/08 Vue.js
详解如何在vue+element-ui的项目中封装dialog组件
2020/12/11 Vue.js
[01:11:37]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第一场 11.19
2020/11/19 DOTA
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
python3生成随机数实例
2014/10/20 Python
Python通过matplotlib画双层饼图及环形图简单示例
2017/12/15 Python
python 快速把超大txt文件转存为csv的实例
2018/10/26 Python
pandas分区间,算频率的实例
2019/07/04 Python
浅析图片上传及canvas压缩的流程
2020/06/10 HTML / CSS
英国IT硬件供应商,定制游戏PC:Mesh Computers
2019/03/28 全球购物
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
高中生毕业自我鉴定范文
2013/12/22 职场文书
市场营销个人求职信范文
2014/02/02 职场文书
2014最新离职证明范本
2014/09/12 职场文书
上课说话检讨书500字
2014/11/01 职场文书
医德医风个人工作总结2014
2014/11/14 职场文书
物业前台接待岗位职责
2015/04/03 职场文书
成品仓库管理员岗位职责
2015/04/09 职场文书
绿色环保倡议书
2015/04/28 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
安全教育片观后感
2015/06/17 职场文书
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
2021/04/01 PHP
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL