1. 程式人生 > >ES6 變量聲明

ES6 變量聲明

指向 有變 告訴 之前 兩種 修改 這樣的 直接 ++

變量聲明const和let
在ES6之前,我們都是用var關鍵字聲明變量。無論聲明在何處,都會被視為聲明在函數的最頂部(不在函數內即在全局作用域的最頂部)。這就是函數變量提升例如:
function aa() {
if(bool) {
var test = ‘hello man‘
} else {
console.log(test)
}
}

以上的代碼實際上是:
function aa() {
var test // 變量提升
if(bool) {
test = ‘hello man‘
} else {
//此處訪問test 值為undefined
console.log(test)
}
//此處訪問test 值為undefined
}

所以不用關心bool是否為true or false。實際上,無論如何test都會被創建聲明。
接下來ES6主角登場:
我們通常用let和const來聲明,let表示變量、const表示常量。let和const都是塊級作用域。怎麽理解這個塊級作用域?
● 在一個函數內部
● 在一個代碼塊內部
說白了 {}大括號內的代碼塊即為let 和 const的作用域。
看以下代碼:
function aa() {
if(bool) {
let test = ‘hello man‘
} else {
//test 在此處訪問不到
console.log(test)
}
}

let的作用域是在它所在當前代碼塊,但不會被提升到當前函數的最頂部。
再來說說const
const 聲明的變量都會被認為是常量,意思就是它的值被設置完成後就不能再修改了。
const name = ‘lux‘
name = ‘joe‘ //再次賦值此時會報錯

還有,如果const的是一個對象,對象所包含的值是可以被修改的。抽象一點兒說,就是對象所指向的地址沒有變就行。
const student = { name: ‘cc‘ }
// 沒毛病
student.name = ‘yy‘
// 如果這樣子就會報錯了
student = { name: ‘yy‘ }

說一道面試題
var funcs = []
for (var i = 0; i < 10; i++) {
funcs.push(function() { console.log(i) })
}
funcs.forEach(function(func) {
func()
})

這樣的面試題是大家常見,很多同學一看就知道輸出 10 十次
但是如果我們想依次輸出0到9呢?
有兩種解決方法。直接看一下代碼。
// ES5告訴我們可以利用閉包解決這個問題
var funcs = []
for (var i = 0; i < 10; i++) {
funcs.push(
(function(value) {
return function() {
console.log(value)
}
})(i)
)
}
funcs.forEach(function(func) {
func()
})

// 再來看看es6怎麽處理的
const funcs = []
for (let i = 0; i < 10; i++) {
funcs.push(function() {
console.log(i)
})
}
funcs.forEach(func => func())

ES6 變量聲明