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 相关文章推荐
Web版彷 Visual Studio 2003 颜色选择器
Jan 09 Javascript
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
Dec 28 Javascript
JAVASCRIPT style 中visibility和display之间的区别
Jan 22 Javascript
基于jquery实现控制经纬度显示地图与卫星
May 20 Javascript
js编码、解码函数介绍及其使用示例
Sep 05 Javascript
使用js画图之正弦曲线
Jan 12 Javascript
Vue.js开发环境搭建
Nov 10 Javascript
JS实现仿百度文库评分功能
Jan 12 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
Mar 02 Javascript
js 函数式编程学习笔记
Mar 25 Javascript
详解如何在Vue项目中导出Excel
Apr 19 Javascript
JQuery获取可视区尺寸和文档尺寸及制作悬浮菜单示例
May 14 jQuery
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递归实现无限分类 格式化数组的详解
2013/06/08 PHP
PHP实现上传多图即时显示与即时删除的方法
2017/05/09 PHP
详解PHP 7.4 中数组延展操作符语法知识点
2019/07/19 PHP
PHP网站常见安全漏洞,及相应防范措施总结
2021/03/01 PHP
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
初识javascript 文档碎片
2010/07/13 Javascript
基于jquery跨浏览器显示的file上传控件
2011/10/24 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
针对初学者的jQuery入门指南
2015/08/15 Javascript
Javascript随机标签云代码实例
2016/06/21 Javascript
js窗口震动小程序分享
2016/11/28 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
2017/01/17 Javascript
Bootstrap table表格简单操作
2017/02/07 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
jquery插件开发之选项卡制作详解
2017/08/30 jQuery
详解ES6 Promise的生命周期和创建
2019/08/18 Javascript
python实现linux服务器批量修改密码并生成execl
2014/04/22 Python
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
教你学会使用Python正则表达式
2017/09/07 Python
Python中return self的用法详解
2018/07/27 Python
python如何生成各种随机分布图
2018/08/27 Python
浅谈python3.6的tkinter运行问题
2019/02/22 Python
Python实现多线程下载脚本的示例代码
2020/04/03 Python
Python将二维列表list的数据输出(TXT,Excel)
2020/04/23 Python
Python基础教程之输入输出和运算符
2020/07/26 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
HTML 5 标签、属性、事件及浏览器兼容性速查表 附打包下载
2012/10/20 HTML / CSS
英国标准协会商店:BSI Shop
2019/02/25 全球购物
Hello Molly美国:女性时尚在线
2019/08/26 全球购物
美国领先的机场停车聚合商:Airport Parking Reservations
2020/02/28 全球购物
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
幼儿园安全责任书
2014/04/14 职场文书
幼儿园师德演讲稿
2014/05/06 职场文书
大班上学期个人总结
2015/02/13 职场文书
Python 绘制多因子柱状图
2022/05/11 Python