當輸入如下**時候
var a = 1;
function
crli
()crli()//1
結果為 1
當改變下面**時候
var a = 1;
function
crli
()crli()//undefined
結果為 undefined
這是為什麼呢?
js解析與執行過程一共有2個階段,乙個預處理階段,乙個是執行階段(可以看成全域性預處理階段和執行階段,以及函式預處理階段和執行階段)
當js解析**時候,會先建立乙個lexical environme這麼乙個物件,然後掃瞄js**兩個部分:
乙個是用宣告方式建立的函式,
另乙個是用var 定義的變數,
然後把函式和變數的名字加到lexical environme中,比方說
lexical environme(**全域性的環境物件===window**)
var a =5;
b = 1;
function
crli
()
如果非函式宣告、非var方式宣告的變數,則預處理階段不會將函式和變數的名字加到lexical environme中
例子1:
a();//aa
b();//b is not a function
function
a()
var b = functionb()
lexical environme
例子2:
console.log(a);//
undefined
console.log(b);//b is
not defined
var a = 1;
b = 2;
lexical environme
當遇到函式宣告有衝突時候後者會覆蓋前者,
變數宣告有衝突時候,會忽略
alert(f);//functionf()
functionf()
var f = 5;
window
alert(f);//functionf()
functionf()
var f = 5;
functionf()
window
function
f(a,b)
}f(1,2)//function a(){}
//2當遇到函式宣告有衝突時候後者會覆蓋前者,
變數宣告有衝突時候,會忽略
lexical environme lexical environme
}
此時解釋
var a = 1;
function
crli
()crli()//undefined
window
lexical environme
函式預處理
執行時,alert(a) 所以是undefind
JS 1 解析與執行
js執行會分為2段,第一段是預處理階段,在window中,第二階段是執行階段,賦值 一 js全域性預處理階段,會載入 1 用宣告的方式建立函式 2 用var定義的變數 舉例 f g var g function 函式表示式 報錯 function f 宣告的方式 console.log a cons...
js執行過程
執行過程 1.宿主環境 瀏覽器 把一段 給js引擎 js引擎按順序執行 因為是宿主環境發起,這也是一條巨集任務 2.需要知道每個巨集觀任務尾部會跟著微任務佇列 當有微觀任務出現,會把他放在微任務佇列中,在上一步的巨集任務執行完後再執行 3.若有巨集觀任務出現,會放入巨集觀任務佇列中,等待上一步微任務...
JS的解析與執行 全域性預處理
js的的解析與執行主要分為兩個階段,一是預處理階段,二是執行階段。js 的執行並不是讀取一行 處理一行 在正式執行 這個階段之前有乙個預處理階段。在預處理階段,我們人為分成全域性 和函式內部 因為兩者有少許差別,因此我們分開講解。今天我們主要講全域性預處理。全域性預處理就的第一步是建立lexical...