今天第一次聽說詞法環(huán)境一铅。。堕油。
<br />
第一次聽潘飘,這是什么鬼?我就呵呵呵掉缺。
<br />
以前卜录,就聽過js有閉包、原型鏈眶明、作用域鏈艰毒。。搜囱。Emmm今天又get到了一個新的知識點丑瞧。
<br />
詞法環(huán)境就詞法環(huán)境吧柑土,別小瞧。嘿绊汹!它還有分類稽屏。
- 全局詞法環(huán)境<br />
說白了他就是window這個爸爸啊。先來看道題目:
console.log(a)
var a = 1
看到題目西乖,大家估計就大概知道狐榔,其實最先學(xué)習(xí)的時候就遇到過,只是大家不注意吧浴栽』牡穑基本功 不扎實的可能就會認(rèn)為輸出1。其實不然典鸡,答案是undefined被廓。沒想到吧。
<br />
用全局詞法環(huán)境解釋萝玷,就說得通了嫁乘。<br />
全局詞法環(huán)境先是預(yù)處理階段,先記錄所在作用域代碼中聲明的變量球碉,不包含沒有var聲明的變量蜓斧。在此就是全局作用域,記錄var a<br />
代碼執(zhí)行階段睁冬,執(zhí)行console.log(a),a未賦值挎春,所以輸出就是undefined哦。
<br />
2. 函數(shù)詞法環(huán)境<br />
首先預(yù)處理階段豆拨,記錄函數(shù)的參數(shù)到詞法環(huán)境直奋,并賦值。
其次到執(zhí)行階段施禾,給預(yù)處理中的變量賦值脚线,將沒有var聲明的變量記錄到全局詞法環(huán)境,并賦值弥搞。<br />
function f(a,b){
console.log(a)
var a = 100
}
f(10,5)
不賣關(guān)子了邮绿,輸出是10。在函數(shù)詞法環(huán)境中攀例,記錄a船逮,但并未賦值。當(dāng)執(zhí)行階段時粤铭,f將a參數(shù)賦值未10傻唾,參數(shù)a和變量a重名并覆蓋,此事a的值為10。所以輸出為10冠骄。
<br />
在此,我只是列舉了兩個比較簡單的例子加袋,復(fù)雜一點的可能就會產(chǎn)生每一行我都讀得懂凛辣,湊一起誰也不認(rèn)識誰≈吧眨看一下這題:
console.log(a)
console.log(b)
console.log(c)
console.log(d)
var a = 1;
If(false)
var b = 2;
else
c = 3
function f(){
var d = 4
}
a輸出為undefined我想不需過多解釋扁誓。先用全局詞法環(huán)境,記錄b(a忽略蚀之,d是函數(shù)內(nèi)不屬于全局),SO,輸出為undefined蝗敢。c為定義,所以輸出就是c is not defined足删。d在函數(shù)f內(nèi)寿谴,全局無法找到d,并且f函數(shù)并未執(zhí)行失受,所以d和c一樣讶泰,也是d is not defined。<br />
類似題目很多拂到,我覺得還是需要處處留意痪署,不然,真的會像我一樣連一些專業(yè)術(shù)語聽都沒聽過兄旬。