執行上下文ec(execution context)
執行上下文功能:**執行之前的準備工作,確定當前環境下變數的取值。
執行上下文目的:用來存放資料的。
分類:1、全域性上下文 (全域性上下文只有乙個 (開啟乙個視窗就會建立乙個全域性上下文,關閉頁面就銷毀))
2、區域性上下文 (函式執行完畢銷毀 (呼叫函式就會建立乙個區域性上下文))
3、eval上下文 (了解) :解讀字串中**。
執行棧( 存放執行上下文 最底層下go 最上面層是正在呼叫執行的函式 注:filo 進棧(壓棧),出棧 規則先進後出)
window 全域性物件
變數提公升:var宣告的變數(除函式內) 值提公升變數的宣告
函式提公升:字面量宣告函式(函式宣告) 提公升整個函式體
執行上下文的宣告週期:
1、建立(變數和函式提公升)
2、執行(函式體的**,會改變當前變數和全域性變數的值)
3、銷毀(指銷毀執行上下文的作用域鏈)
全域性執行上下文
1、全域性物件window (go)
區域性執行上下文:
1、建立區域性物件 ao (呼叫才有ao) 執行物件
2、預編譯
a>形參 變數
b>形參 變數賦值
c>形參和實參相統一
d>函式提公升
e>確定this的指向(由呼叫者確定)
f>確定作用域 (詞法環境 在**宣告,就確定在**)
g>初始化作用域鏈
active object
3、執行函式體**
4、作用域鏈 當前沒有 就找離它當前包含最近的宣告值包含中就沒有去找全域性的
console .log(i) //0 i前自動補全可以出去 i前加var 出不去
var i=1;
function f70()
f70();
作用域:靜態的
執行上下文:動態的(在呼叫前一刻建立上下文) 只有函式才會產生上下文
執行棧(先存放g0在看其它)
for裡面有var 為什麼提公升全域性變數 因為全域性(go)
什麼是閉包?(需要滿足以下兩個條件才是閉包)
1、內部巢狀函式、巢狀函式引用外部變數。
2、內部函式被外部引用。
為什麼使用閉包?
1、解決無法使用的內部變數
2、解決全域性變數汙染問題
自由變數:函式內部使用外部變數,這個變數就是自由變數。
// 注:跨域的變數都是自由變數,即變數宣告和使用不在同乙個作用域。
let j = 1;
function f70() }遞迴
定義:自己呼叫自己
注:一定要有結束(出口);
// 遞迴
const arr =[1
,2,"a"
,"f70",[
true
,false],
["***"
,"yyy",[
"zzz"
,"0"]]
];let dataarr=
;function
f70(temp)
else
} temp.
map(item=>
typeof item ==
'object'
?f70
(item)
:dataarr.
push
(item));
// temp.foreach(item=>typeof item =='object'? f70(item):dataarr.push(item));
}f70
(arr)
; console.
log(dataarr)
;
js執行上下文與執行上下文棧
在了解js的執行上下文物件與執行上下文棧之前,我們要先了解兩個概念 即變數提公升跟函式提公升 變數提公升 通過var定義的變數,在定義語句之前我們就可以直接訪問到,不過它的值是undefined 函式提公升 通過function定義的函式,在函式定義語句前,我們就可以直接呼叫 變數提公升與函式提公升...
JS作用域 執行上下文 遞迴與閉包
目錄 作用域全域性作用域 函式作用域 執行上下文 函式執行上下文 執行上下文棧 作用域與執行上下文的區別 遞迴閉包 產生閉包的條件 閉包的作用 使用注意 記憶體洩漏 記憶體溢位 一種程式執行出現的錯誤 作用域指乙個變數的作用範圍。它是靜態的 相對於上下文物件 在編寫 時就確定了。作用 隔離變數,不同...
JS高階(6) 執行上下文與執行上下文棧
一 變數提公升和函式提公升 變數宣告提公升 函式宣告提公升 面試題 輸出 undefined undefined 變數提公升 fn2 可呼叫 函式提公升 fn3 不能 變數提公升 二 執行上下文 分類 根據位置分 全域性執行上下文 開始執行全域性 函式執行上下文 開始執行函式體 三 執行上下文棧 在...