window 是最大最外圍的執行環境,然後每個函式都有自己的執行環境。js**是從上到下執行的,單純的用語言描述可能會有點繞,而且不大直觀。我們看著**來
console.log('global begin:' +i);上面**依次輸出的是什麼?var i = 1foo(1)
function
foo(i)
console.log('foo() begin:' +i);
foo(i+1)
console.log('foo() end:' +i);
}console.log('global end:' + i);
一進來先是 window 執行環境,然後 window 會把先把裡面的變數和函式提公升,然後在從上到下執行。到 foo(1)時 會建立乙個 foo的執行環境,然後就會去執行函式,在這應該都沒有問題。 當 i= 3的時候執行的是 foo(4)滿足條件,直接退出。執行
console.log('foo() end:' + i); // 3 重點就在這為什麼是 3
就是這個執行環境在作怪,每次呼叫函式都會建立乙個執行上下文環境,並把這個執行函式推進了棧裡面,只有這個函式完全執行完畢了這個環境才會被釋放的,因為之前的函式並沒有執行完
console.log('foo() end:' + i); 這個還沒有執行,所以他們會被一直儲存在棧中。棧有乙個特點就是後進先出
這個就是執行 foo(4)時的棧,foo(4)執行完了被釋放,我們就執行foo(3)剩餘的東西,直到把 foo 函式都執行完,棧裡面就只剩下 window 了。只有關閉瀏覽器視窗的時候window才會被釋放。
作用域鏈:其實每個執行環境都對應了乙個變數物件,這個變數物件中就儲存了當前環境中定義的所有變數和函式。當**在乙個環境中執行的時候就會建立變數物件的乙個作用域鏈。如果是函式,他的物件是活動物件,最開始的時候只包含了乙個 arguments ,他的作用域鏈中的下乙個變數物件就是包含他的環境,就這樣一層一層下去,直到最底層的 window
能力有限,表達的可能不是很清楚,如果有什麼不對的請指正
js 執行環境及作用域
執行環境定義了變數或函式有權訪問的其他資料,決定了他們各自的行為。每個執行環境都有乙個與之關聯的變數物件,環境中定義的所有變數和函式都儲存在這個物件中。每個函式都有自己的執行環境。當執行流進入乙個函式時,函式的環境會被推入乙個環境棧中。而在函式執行之後,棧將其環境彈出,把控制權返回給之前的執行環境。...
JS學習之執行環境和作用域
執行環境 執行環境定義了變數或函式有權訪問的其他資料,決定了它們各自的行為。變數物件每個執行環境都有與之關聯的變數物件,環境中定義的所有變數和函式都儲存在這個物件中。雖然我們在編寫程式時,無法訪問這個物件,但是解析器在處理資料時會在後台使用它。全域性執行環境是最外層的乙個執行環境。根據ecmascr...
js的執行環境與作用域
var person lisa console.log window.person lisa const person2 lily console.log window.person2 error 報錯var color blue function changecolor else changeco...