let, const
来源:互联网 发布:网络你牛什么牛视频 编辑:程序博客网 时间:2024/05/22 14:04
这两个的用途与var类似,都是用来声明变量的,但在实际运用中他俩都有各自的特殊用途。
首先来看下面这个例子:
var name = 'zach'while (true) { var name = 'obama' console.log(name) //obama break}console.log(name) //obama
使用var两次输出都是obama,这是因为ES5只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。第一种场景就是你现在看到的内层变量覆盖外层变量。而let则实际上为JavaScript新增了块级作用域。用它所声明的变量,只在let命令所在的代码块内有效。
let name = 'zach'while (true) { let name = 'obama' console.log(name) //obama break}console.log(name) //zach
另外一个var带来的不合理场景就是用来计数的循环变量泄露为全局变量,看下面的例子:
var a = [];for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); };}a[6](); // 10
上面代码中,变量i是var声明的,在全局范围内都有效。所以每一次循环,新的i值都会覆盖旧值,导致最后输出的是最后一轮的i的值。而使用let则不会出现这个问题。
var a = [];for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); };}a[6](); // 6
再来看一个更常见的例子,了解下如果不用ES6,而用闭包如何解决这个问题。
var clickBoxs = document.querySelectorAll('.clickBox')for (var i = 0; i < clickBoxs.length; i++){ clickBoxs[i].onclick = function(){ console.log(i) }}
我们本来希望的是点击不同的clickBox,显示不同的i,但事实是无论我们点击哪个clickBox,输出的都是5。下面我们来看下,如何用闭包搞定它。
function iteratorFactory(i){ var onclick = function(e){ console.log(i) } return onclick;}var clickBoxs = document.querySelectorAll('.clickBox')for (var i = 0; i < clickBoxs.length; i++){ clickBoxs[i].onclick = iteratorFactory(i)}
const也用来声明变量,但是声明的是常量。一旦声明,常量的值就不能改变。const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。对于const来说,只声明不赋值,就会报错。
const PI = Math.PIPI = 23 //Module build failed: SyntaxError: /es6/app.js: "PI" is read-only
当我们尝试去改变用const声明的常量时,浏览器就会报错。
const有一个很好的应用场景,就是当我们引用第三方库的时声明的变量,用const来声明可以避免未来不小心重命名而导致出现bug:
const monent = require('moment')
阅读全文
0 0
- let, const
- let、const
- let和const
- 【ES6】let和const
- let和const命令
- var、let、const小解
- es6 箭頭函數 let, const
- es6---(let const)
- let和const命令
- es6 let和const
- ES6---let与const
- let和const命令
- ES6之let,const
- let和const命令
- let和const命令
- call/apply let const
- let和const命令
- let和const命令
- String和StringBuffer的区别
- HDU 1392 Surround the Trees(计算几何,求凸包周长)
- 解决冲突
- redis的简介和安装笔记(1)
- 使用VS+OpenCV的图像处理简单例子
- let, const
- Codeforces 486D Valid Set 树形DP+计数
- 分支管理策略
- VS2017使用Boost库中出现的小问题
- ANDROID-ContentProvider
- Redis入门指南之集群
- lambda以及递归
- Bug分支
- PL/SQL developer10注册码