前言
5月份的時(shí)候立了一個(gè)flag蝌戒,然后就被打臉们颜。
作用域
傳統(tǒng)編譯語言(執(zhí)行前)
- 分詞/語法分析
- 分解成詞法單元
- 解析/語法分析
- 將詞法單元流 --> AST樹
- 代碼生成
- AST樹 --> 可執(zhí)行代碼
LHS和RHS
賦值:LHS
取值和其他:RHS
作用域分類
動(dòng)態(tài)作用域
作用域作為運(yùn)行時(shí)被動(dòng)態(tài)確定的形式
function foo(){
console.log(a); //3
}
function bar(){
var a = 3;
foo();
}
var a = 2;
bar();
詞法作用域
function foo(){
console.log(a); //2
}
function bar(){
var a = 3;
foo();
}
var a = 2;
bar();
欺騙詞法作用域
這樣的寫法均會(huì)導(dǎo)致瀏覽器內(nèi)核對(duì)javascript編譯時(shí)很多優(yōu)化失效。從而降低性能拼缝。
eval()
,new Function()
將對(duì)象的屬性當(dāng)做作用域的標(biāo)識(shí)符礁遣,從而創(chuàng)建一個(gè)新的詞法作用域。
老實(shí)講壤玫,我也不太理解上面一句話是什么意思豁护。
在嚴(yán)格模式下哼凯,eval無法修改當(dāng)前詞法作用域。
with
將一個(gè)對(duì)象的引用當(dāng)做作用域來處理楚里。
在嚴(yán)格模式下断部,with被禁用。
匿名函數(shù)表達(dá)式
缺點(diǎn)
- 錯(cuò)誤棧難以追蹤
- 無法引用自身
- 省略了描述性的名稱
解決方法:行內(nèi)函數(shù)表達(dá)式
(function aaa(){
})()
解決全局undefined被賦值為true
var undefined = true;
(function(undefined){
//do something
})()
塊作用域
- with
- try/catch
小應(yīng)用
如果一段代碼后面是異步操作班缎,由于異步位于同一個(gè)作用域蝴光,用塊作用域有利于垃圾回收機(jī)制
//下面兩行可用塊作用域包裹她渴,以便回收
var something = {/*...*/};
dosomething(something);
btn.addEventListener("click",function(evt){
console.log("111");
})
提升
函數(shù)提升會(huì)高于變量提升,然后重復(fù)的var聲明會(huì)被忽略
后面的函數(shù)提升會(huì)覆蓋前面的函數(shù)提升
閉包
當(dāng)函數(shù)可以記住并訪問所在的詞法作用域時(shí)蔑祟,就產(chǎn)生了閉包趁耗,即便該函數(shù)是在當(dāng)前詞法作用域外執(zhí)行。