es6 學習
let的作用域-塊級作用域
var name = 'zach'
while(true){
var name = 'obama'
console.log(name)
break
}
console.log(name)
//let和var的區別在于作用域不同
let name = 'zach'
while(true){
let name = 'name'
console.log(name) //obama
break
}
console.log(name)
//let的另外一個常用的地方在于for循環中
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
var clickBoxs = document.querySelectorAll('.clickBox')
for (var i = 0; i < clickBoxs.length; i++){
clickBoxs[i].onclick = function(){
console.log(i)
}
}
``
另外一個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 PI = Math.PI
PI = 23 //Module build failed: SyntaxError: /es6/app.js: "PI" is read-only
當我們嘗試去改變用const聲明的常量時,瀏覽器就會報錯。
const有一個很好的應用場景,就是當我們引用第三方庫的時聲明的變量,用const來聲明可以避免未來不小心重命名而導致出現bug:
const monent = require('moment')
鏈接:http://www.lxweimin.com/p/ebfeb687eb70