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新窗口与子窗口传值详解
Feb 11 Javascript
jquery实现点击弹出层效果的简单实例
Mar 03 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
Apr 08 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
May 21 Javascript
jQuery多级联动下拉插件chained用法示例
Aug 20 Javascript
移动端日期插件Mobiscroll.js使用详解
Dec 19 Javascript
JS中的phototype详解
Feb 04 Javascript
Web制作验证码功能实例代码
Jun 19 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
Dec 16 Javascript
AngularJS集合数据遍历显示的实例
Dec 27 Javascript
详解SPA中前端路由基本原理与实现方式
Sep 12 Javascript
JS实现时间校验的代码
May 25 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
批量修改RAR文件注释的php代码
2010/11/20 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
Laravel 之url参数,获取路由参数的例子
2019/10/21 PHP
JScript中的&quot;this&quot;关键字使用方式补充材料
2007/03/08 Javascript
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
Javascript 中的 &amp;&amp; 和 || 使用小结
2010/04/25 Javascript
js汉字转拼音实现代码
2013/02/06 Javascript
博客侧边栏模块跟随滚动条滑动固定效果的实现方法(js+jquery等)
2013/03/24 Javascript
JS的千分位算法实现思路
2013/07/31 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
2015/03/20 Javascript
快速掌握Node.js环境的安装与运行方法
2016/02/16 Javascript
angularjs表格ng-table使用备忘录
2016/03/09 Javascript
Bootstrap CDN和本地化环境搭建
2016/10/26 Javascript
微信小程序 引用其他js文件实现代码
2017/02/22 Javascript
求js数组的最大值和最小值的四种方法
2017/03/03 Javascript
JS实现字符串去重及数组去重的方法示例
2018/04/21 Javascript
vue改变对象或数组时的刷新机制的方法总结
2019/04/24 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
实例分析javascript中的异步
2020/06/02 Javascript
jQuery实现B2B网站后台管理系统侧导航
2020/07/08 jQuery
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
python实现带验证码网站的自动登陆实现代码
2015/01/12 Python
python中format()函数的简单使用教程
2018/03/14 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
2018/03/20 Python
python3个性签名设计实现代码
2018/06/19 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
python issubclass 和 isinstance函数
2019/07/25 Python
python实现画出e指数函数的图像
2019/11/21 Python
解决Tensorboard 不显示计算图graph的问题
2020/02/15 Python
python缩进长度是否统一
2020/08/02 Python
导游个人求职信
2014/04/25 职场文书
清明节演讲稿
2014/05/27 职场文书
办公室领导干部作风整顿个人整改措施
2014/09/17 职场文书
工作期间打牌检讨书范文
2014/11/20 职场文书
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang