ECMAScript6块级作用域及新变量声明(let)


很多语言中都有块级作用域,但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;
}

以上所述就是本文的全部内容了,希望大家能够喜欢。



相关阅读:
Win10准正式版10240出现UAC窗口提示问题
最简单的Oracle数据恢复 select as of使用方法
苹果Mac查看硬盘是否开启ACHI模式的方法图解
php实现数组筛选奇数和偶数示例
谈一谈js中的执行环境及作用域
使用getBoundingClientRect方法实现简洁的sticky组件的方法
asp.net 图标提取以及图标转换的实例代码
Android App开发中Gradle构建过程的配置方法
jQuery中阻止冒泡事件的方法介绍
HTML5几个设计和修改的页面范例分享
.NET运行界面上,实现随意拖动控件的方法
用PHP提取中英文词语以及数字的首字母的方法介绍
Win7复制文件时提示错误代码0X80070057的解决方法
javascript实现动态加载CSS
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 假如我是长江作文100字 儒家名言名句60条 小学二年级作文350字:送鱼 爱的集体 游走在高三的边缘 夫妻之道 拖神·妖公子发表日志:日记? 哈密明天更美好作文400字 写给新高三的同学的暑假学习指南 致我敬爱的人 行酒令 寒假日记:一人在家的夜晚 不是“想”,而是“一定要” 农业大学团委工作计划 "六一"联欢会主持串词 世界遗产的作文300字 苦难与造化 怀念那棵白蜡树 市环境保护局工作报告 关于圣诞节的作文:圣诞美丽事迹 未来汽车作文 教师九月工作总结 你依然 关于政协如何为构建和谐社会作贡献的思考 心得:领导干部应加强学习 旅游心得体会范文 去温州 小学六年级作文550字:学乐中国走进了我的生活 理工大门口 孤独者的盛宴 描写古代男人冷酷的语句 这片荷塘月色 寂寞的疼痛 木桃果 can not forget 小猪菲菲减肥记作文450字 放纵的流年,放任的依恋 今晚的中秋节作文600字 爱情的旅程 金婚贺词 小学三年级作文300字:姑姑家“一日游” 【精品】产品包装策划方案 新学期学校工作计划 读斑羚飞渡有感350字 读懂生命 荆韬 竞选十佳中学生演讲稿 日本,听我对你说400字 羊年七夕祝福短语 一杯咖啡距离的你 指间仅残留一段往昔

Copyright © 2016 phpStudy |