var funcs = []
for (var i = 0; i < 10; i++) {
funcs.push(function() {
return i;
})
console.log(funcs[i]())
}
funcs.forEach(function(func) {
console.log(func());
})複製代碼
這道題的輸出結果數組
解析:funcs數組Push進去了十個匿名函數,在for循環的做用域內直接調用能夠輸出i的值,在for循環結束後,全局變量i 的值爲10,此時forEach函數遍歷調用裏面的匿名函數,沿着做用域向上尋找到 i =10,因此打印十個10瀏覽器
這題還涉及到一個關鍵的知識:函數只有在調用的時候纔會執行內部的方法,不然只是定義了一個方法bash
如何讓forEach正確輸出0-9,有兩種方法函數
方法1:ES5的當即執行函數ui
當即執行函數會建立一個獨立的做用域,至關於「私有」的命名空間this
var funcs = []
for(var i = 0; i < 10; i++) {
funcs.push(
(function(value) {
return function() {
return value;
}
})(i)
)
}
funcs.forEach(function(func) {
console.log(func())
})
複製代碼
方法2:ES6的letspa
var funcs = []
for (let i = 0; i < 10; i++) {
funcs.push(function() {
return i;
})
console.log(funcs[i]())
}
funcs.forEach(function(func) {
console.log(func());
})複製代碼
2.題目二code
console.log(a) // undefined
var a = 100
console.log(a) // 100
function person(name){ // 聲明函數
age=20
console.log(name,age)
var age
}
person('man') // man,20複製代碼
瀏覽器解析時,把變量進行提高,而後全設置爲undefined,等到執行到賦值時才進行賦值cdn
3.題目二對象
var i = 10
function aaa () {
i = 20
console.log(i) // 第1個log 20
for (var i = 0; i < 6; i++) {
console.log(i) // 第2個log 0 1 2 3 4 5
}
console.log(this.i) // 第3個log 10
console.log(i) // 第4個log 6
}
aaa()
console.log(i) // 第5個log 10複製代碼
這題涉及到四個點
上面代碼等價於下
var i = 10
function aaa () {
var i //變量提高
i = 20
console.log(i) // 第1個log 20
for (i = 0; i < 6; i++) {
console.log(i) // 第2個log 0 1 2 3 4 5
}
console.log(this.i) // 第3個log 10
console.log(i) // 第4個log 6
}
aaa()
console.log(i) // 第5個log 10複製代碼
第一個輸出 因爲給局部變量i賦值 因此輸出20
第二個輸出for循環 輸出0 1 2 3 4 5,當i = 6時終止循環
第三個輸出,在通常函數中使用this指代全局對象,此是this.i = window.i 輸出10
第四個輸出,上面for循環結束後i =6 ,因此輸出6
第五個輸出,輸出全局變量 i =10