JS-做用域題目

  1. 做用域相關題目一
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複製代碼

這題涉及到四個點

  1. 內部環境能夠經過做用域鏈訪問全部的外部環境
  2. 外部環境不能訪問內部環境中的任何變量
  3. 即每一個環境均可以向上搜索做用域鏈,以查詢變量和函數
  4. 任何環境不能向下搜索做用域鏈而進入另外一環境

上面代碼等價於下

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

相關文章
相關標籤/搜索