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 相关文章推荐
jQuery 判断页面元素是否存在的代码
Aug 14 Javascript
ExtJS下grid的一些属性说明
Dec 13 Javascript
推荐17个优美新鲜的jQuery的工具提示插件
Sep 14 Javascript
Js动态添加复选框Checkbox的实例方法
Apr 08 Javascript
ajax与302响应代码测试
Oct 23 Javascript
JS实现跟随鼠标闪烁转动色块的方法
Feb 26 Javascript
jQuery模拟新浪微博首页滚动效果的方法
Mar 11 Javascript
jQuery实现的兼容性浮动层示例
Aug 02 Javascript
javascript滚轮事件基础实例讲解(37)
Feb 14 Javascript
jQuery实现字体颜色渐变效果的方法
Mar 29 jQuery
基于Vue实现图书管理功能
Oct 17 Javascript
JavaScript实现微信红包算法及问题解决方法
Apr 26 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中copy on write写时复制机制介绍
2014/05/13 PHP
php实现批量压缩图片文件大小的脚本
2014/07/04 PHP
PHP如何通过表单直接提交大文件详解
2019/01/08 PHP
PHP后台备份MySQL数据库的源码实例
2019/03/18 PHP
JavaScript中的集合及效率
2010/01/08 Javascript
JavaScript 事件冒泡简介及应用
2010/01/11 Javascript
jQuery EasyUI API 中文文档 - PropertyGrid属性表格
2011/11/18 Javascript
js中生成map对象的方法
2014/01/09 Javascript
JavaScript省市联动实现代码
2014/02/15 Javascript
javascript批量修改文件编码格式的方法
2015/01/27 Javascript
JS阻止事件冒泡行为和闭包的方法
2016/06/16 Javascript
函数四种调用模式以及其中的this指向
2017/01/16 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
2017/08/04 Javascript
原生JavaScript实现remove()和recover()功能示例
2018/07/24 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
2019/09/16 Javascript
小程序的上传文件接口的注意要点解析
2019/09/17 Javascript
修改Vue打包后的默认文件名操作
2020/08/12 Javascript
Python中的字典遍历备忘
2015/01/17 Python
对numpy和pandas中数组的合并和拆分详解
2018/04/11 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
实时获取Python的print输出流方法
2019/01/07 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
2019/01/17 Python
使用python爬取微博数据打造一颗“心”
2019/06/28 Python
Django框架安装及项目创建过程解析
2020/09/14 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
枚举和一组预处理的#define有什么不同
2016/09/21 面试题
理工大学毕业生自荐信
2013/11/01 职场文书
省三好学生申请材料
2014/01/22 职场文书
社会治安综合治理管理责任书
2014/04/16 职场文书
竞选班干部演讲稿
2014/04/24 职场文书
老干部工作先进集体事迹材料
2014/05/21 职场文书
工地宣传标语
2014/06/18 职场文书
优秀共产党员演讲稿
2014/09/04 职场文书
2016重阳节红领巾广播稿
2015/12/18 职场文书
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL