了解JavaScript中let语句


Posted in Javascript onMay 30, 2019

使用let语句,允许你在JavaScript中创建块范围局部变量。let语句是在JavaScript的ECMAScript 6标准中引入的。

在你往下了解let语句之前,我建议你先查看基于Infragistics jQuery库的Ignite UI,它可以帮助你更快地编写和运行Web应用程序。你可以使用JavaScript库的Ignite UI来快速解决HTML5,jQuery,Angular,React或ASP.NET MVC中复杂的LOB需求。(你可以在这里下载Ignite UI的免费试用版。)

在ECMAScript 6之前,JavaScript有三种类型的范围:

  • 全局范围
  • 函数范围
  • 词汇范围

为了详细探索let语句,请细想下面的代码段:

function foo() {
var x = 9;
if (x > 5) {
var x = 7;
console.log("Value of x in if statement = " + x);
}
console.log("Value of x outside if statement = " + x);
}
foo();

以上代码得到的输出:

了解JavaScript中let语句

在上面的代码中,我们使用var语句声明变量x。因此,变量x的范围是函数范围。if语句内的变量x 就是if语句外创建的变量x 。因此,在你修改if语句块内变量x的值时,也会修改函数中变量x的所有引用的值。

为了避免这种情况,你需要使用块级别范围,let语句允许你创建块范围的局部变量。

修改上面的代码片段,使用let语句声明变量:

function foo() {
var x = 9;
if (x > 5) {
let x = 7;
console.log("Value of x in if statement = " + x);
}
console.log("Value of x outside if statement = " + x);
}
foo();

在上面的代码段中,我们使用let语句来声明范围级局部变量x。因此,在if语句内更新变量x的值不会影响if语句外的变量x的值。

下面是上述代码的输出:

了解JavaScript中let语句

与使用函数范围(或全局范围)声明的变量不同,使用let声明的变量是块范围的:它们只存在于它们定义的块中。

变量提升

使用let声明的变量提升不同于使用var声明的变量。因此,使用let声明的变量没有变量提升,这意味着使用let声明的变量不会移动到执行上下文的顶部。

为了更好地理解这一点,请看以下这段代码:

function foo() {
console.log(x);
console.log(y);
var x = 9;
let y = 67;
}
foo();

作为输出,你将获得变量y的ReferenceError,变量y使用let语句声明。使用let声明的变量不会提升到执行上下文之上。

了解JavaScript中let语句

重新声明变量

你不能在同一个函数或块中使用let重新声明一个变量。这样做会出现语法错误。请看以下代码:

function foo() {
if(true){
let x = 9;
let x = 89; 
}
}
foo();

运行上面的代码会出来一个语法错误,如下所示:

了解JavaScript中let语句

暂时性死区

有时,使用let声明的变量会导致暂时性死区。在以下代码中,let x=x+67 将抛出x未定义的异常。

之所以会出现这个错误,是因为表达式(x + 67)求的是if块范围内局部变量x的值,而不是函数范围内局部变量x的值。运行上面的代码,你会得到这样一个异常:

了解JavaScript中let语句

你可以通过移动声明变量到表达式的上面一行来修复上述错误,如下所示:

块级范围界定是任何编程语言最重要的功能之一,并且随着ECMAScript 6中let语句的引入,JavaScript现在也有了这个功能。使用let语句,允许创建一个作用域在块范围内的变量。这可以解决许多问题,例如全局范围变量的意外修改,闭包中的局部变量,以及帮助编写更清晰的代码。

英文原文:Easy JavaScript, Part 1: Learn the 'let' Statement

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript类库的顶层对象名用户体验分析
Oct 24 Javascript
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
Feb 03 Javascript
Ext JS 4官方文档之三 -- 类体系概述与实践
Dec 16 Javascript
使用jquery写个更改表格行顺序的小功能
Apr 29 Javascript
jquery ztree实现下拉树形框使用到了json数据
May 14 Javascript
javascript trim函数在IE下不能用的解决方法
Sep 12 Javascript
jquery加载图片时以淡入方式显示的方法
Jan 14 Javascript
JS实现IE状态栏文字缩放效果代码
Oct 24 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
Dec 16 Javascript
vue.js初学入门教程(1)
Nov 03 Javascript
深入理解ES6中let和闭包
Feb 22 Javascript
修改Vue打包后的默认文件名操作
Aug 12 Javascript
koa+jwt实现token验证与刷新功能
May 30 #Javascript
深入理解JavaScript 箭头函数
May 30 #Javascript
socket在egg中的使用实例代码详解
May 30 #Javascript
深入了解JavaScript 私有化
May 30 #Javascript
jQuery模拟html下拉多选框的原生实现方法示例
May 30 #jQuery
Vue CL3 配置路径别名详解
May 30 #Javascript
Vue CLI3中使用compass normalize的方法
May 30 #Javascript
You might like
简单的移动设备检测PHP脚本代码
2011/02/19 PHP
成为好程序员必须避免的5个坏习惯
2014/07/04 PHP
php中current、next与reset函数用法实例
2014/11/17 PHP
laravel学习教程之存取器
2016/07/30 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
2017/07/16 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
禁止js文件缓存的代码
2010/04/09 Javascript
从盛大通行证上摘下来的身份证验证js代码
2011/01/11 Javascript
javascript 二进制运算技巧解析
2012/11/27 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
javascript正则表达式使用replace()替换手机号的方法
2015/01/19 Javascript
jQuery siblings()用法实例详解
2016/04/26 Javascript
详解Node.js:events事件模块
2016/11/24 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
2016/11/29 Javascript
Promise.all中对于reject的处理方法
2018/08/01 Javascript
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
Vue框架里使用Swiper的方法示例
2018/09/20 Javascript
vue中格式化时间过滤器代码实例
2019/04/17 Javascript
[04:13]2014DOTA2国际邀请赛 专访DC目前形势不容乐观
2014/07/12 DOTA
[05:31]DOTA2上海特级锦标赛主赛事第三日RECAP
2016/03/05 DOTA
[00:15]天涯墨客终极技能展示
2018/08/25 DOTA
Python Tkinter GUI编程入门介绍
2015/03/10 Python
python提取图像的名字*.jpg到txt文本的方法
2018/05/10 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
Python3实现的反转单链表算法示例
2019/03/08 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
使用placeholder属性设置input文本框的提示信息
2020/02/19 HTML / CSS
人事主管岗位职责范本
2013/12/04 职场文书
小学六一儿童节活动方案
2014/08/27 职场文书
党员学习群众路线心得体会
2014/11/04 职场文书
大二学年个人总结
2015/03/03 职场文书
2015年英语教学工作总结
2015/05/25 职场文书
Python3接口性能测试实例代码
2021/06/20 Python
JavaWeb实现显示mysql数据库数据
2022/03/19 Java/Android
vue使用watch监听属性变化
2022/04/30 Vue.js
MySQL普通表如何转换成分区表
2022/05/30 MySQL