7.25筆記《你不知道的javascript》詞法作用域

<script>
function foo(a){//a=2
    //定義局部變量 b = 2*2 ;b實(shí)際 = 4;
    var b = a*2;
    //內(nèi)部函數(shù)
    function bar(c){//這里c = 12;
        //打印a,b,c( 2, 4, 12)
        console.log(a,b,c);
        /*查找
        執(zhí)行console.log(...)聲明,并查找a,b,c三個變量的引用。
        它首先從最內(nèi)部的作用域bar()函數(shù)的作用域開始查找。
        開始查找a,bar內(nèi)部沒有,所以它就去上一級foo()函數(shù)作用域查找,
        找到了a并確定了值,b同理。對于c來說就在bar內(nèi)部,不需要往上一級查找;
        作用域查找會在找到第一個匹配的標(biāo)識符時停止;
        在多層的嵌套作用域中可以定義同名的《標(biāo)識符》,這叫做‘遮蔽效應(yīng)’
        (內(nèi)部的標(biāo)識符‘遮蔽’了外部的標(biāo)識符)。拋開遮蔽效應(yīng),作用域查找
        始終從運(yùn)行時所處的最內(nèi)部作用域開始,逐級向外查找,直到查到第一個標(biāo)識符為止。
    */
    }

    bar(b*3);//調(diào)用bar函數(shù)傳入 b = 4*3;b = 12;
}

foo(2);//調(diào)用函數(shù)foo傳入?yún)?shù)2;第二步:執(zhí)行foo函數(shù)內(nèi)部函數(shù)bar的方法打印出a,b,c

/*
首先,這個例子中有三個嵌套作用域
1.包含foo函數(shù)的-全局作用域;
2.包含著 變量a,變量b以及函數(shù)bar的 - foo函數(shù)作用域;
3.包含著只有 變量c的函數(shù) - bar作用域
 */
</script>
<script>
//欺騙詞法作用域
function foo2(str,a){
    eval(str);//欺騙
    console.log(a,b)
}
var b = 2;
foo2('var b = 3;',1)//1,3
//eval(...)調(diào)用中的var b = 3 ,這段代碼會被當(dāng)成本來就在那,
//重新聲明的b會覆蓋全局聲明var b = 2;這段代碼實(shí)際在foo2(...)
//函數(shù)作用域中創(chuàng)建了一個變量b,從而遮蔽全局作用域的同名變量。
//不推薦使用,同樣with也不推薦使用。因?yàn)榭催@個肯定還是弱雞,并不能用好。
</script>
<!-- 小結(jié) -->
<!-- 
    詞法作用域是由寫代碼時函數(shù)聲明的位置來決定的,
    javascript中有兩個機(jī)制可以‘欺騙’詞法作用域:
    eval()和with,前者可以對一段包含一個或多個聲明的代碼
    ‘字符串’進(jìn)行演算,借此修改已經(jīng)存在的詞法作用域(在運(yùn)行時);
    with本質(zhì)是是通過將一個對象的引用當(dāng)做作用域來處理,將對象的
    屬性當(dāng)做作用域中的標(biāo)識符來處理,從而創(chuàng)建一個新的詞法作用域;
    這兩個都存在嚴(yán)重問題,當(dāng)你還不是大佬的時候請謹(jǐn)慎使用。
 -->
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容