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 相关文章推荐
iframe 自适应高度[在IE6 IE7 FF下测试通过]
Apr 13 Javascript
js setTimeout 常见问题小结
Aug 13 Javascript
JQuery中serialize()用法实例分析
Feb 06 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
Apr 27 Javascript
微信小程序实战篇之购物车的实现代码示例
Nov 30 Javascript
JavaScript学习笔记之DOM操作实例分析
Jan 08 Javascript
js array数组对象操作方法汇总
Mar 18 Javascript
Vue CL3 配置路径别名详解
May 30 Javascript
vue实现图片预览组件封装与使用
Jul 13 Javascript
vue 解决文本框被键盘遮住的问题
Nov 06 Javascript
Vue+tracking.js 实现前端人脸检测功能
Apr 16 Javascript
JavaScript array常用方法代码实例详解
Sep 02 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
全国FM电台频率大全 - 4 山西省
2020/03/11 无线电
提升PHP执行速度全攻略(上)
2006/10/09 PHP
PHP新手入门学习方法
2011/05/08 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
php生成微信红包数组的方法
2019/09/05 PHP
$(document).ready(function() {})不执行初始化脚本
2014/06/19 Javascript
一个JavaScript去除字符串末尾的空白实例代码
2014/09/22 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
基于jQuery创建鼠标悬停效果的方法
2015/03/07 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
基于JavaScript实现移动端点击图片查看大图点击大图隐藏
2015/11/04 Javascript
js实现简单排列组合的方法
2016/01/27 Javascript
js 弹出对话框(遮罩)透明,可拖动的简单实例
2016/07/11 Javascript
AngularJS extend用法详解及实例代码
2016/11/15 Javascript
vue.js分页中单击页码更换页面内容的方法(配合spring springmvc)
2018/02/10 Javascript
原生js检测页面加载完毕的实例
2018/09/11 Javascript
JS为什么说async/await是generator的语法糖详解
2019/07/11 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
Jquery如何使用animation动画效果改变背景色的代码
2020/07/20 jQuery
npm ci命令的基本使用方法
2020/09/20 Javascript
基于react项目打包css引用路径错误解决方案
2020/10/28 Javascript
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
Python语言的12个基础知识点小结
2014/07/10 Python
python实现udp数据报传输的方法
2014/09/26 Python
整理Python中的赋值运算符
2015/05/13 Python
Django添加favicon.ico图标的示例代码
2018/08/07 Python
Django跨域请求CSRF的方法示例
2018/11/11 Python
pyqt 多窗口之间的相互调用方法
2019/06/19 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
html5使用canvas画空心圆与实心圆
2014/12/15 HTML / CSS
DOM和JQuery对象有什么区别
2016/11/11 面试题
单位绩效考核方案
2014/05/11 职场文书
体育教师求职信
2014/05/24 职场文书
和谐社区口号
2014/06/19 职场文书
2014和解协议书范文
2014/09/15 职场文书
师德师风个人总结
2015/02/06 职场文书