第一部分 第2章 詞法作用域

詞法作用域

詞法作用域
  • 作用域查找會在找到第一個匹配的標(biāo)識符時停止安吁,內(nèi)部標(biāo)識符會屏蔽同名外部標(biāo)識符。

  • 全局變量會自動成為全局對象(比如window或global)睛琳,但這里有點小小的區(qū)別:

    var a=1;
    b=2;
    function(){
        var c=3;
        d=4;
    }
    

    若上面代碼在瀏覽器中盒蟆,全局對象是window,a师骗,b历等,d都會成為window的屬性,即均可以通過window.a訪問(非嚴(yán)格模式下辟癌,嚴(yán)格模式下不通過var聲明會報錯)寒屯。
    若上面的代碼在vscode中,全局對象是global,只有b寡夹,d會成為global的屬性(非嚴(yán)格模式下处面,嚴(yán)格模式下不通過var聲明會報錯),global不會自動把用var聲明的變量添加為自己的屬性菩掏。

欺騙詞法

詞法作用域完全由寫代碼期間函數(shù)所聲明的位置來定義魂角,通過欺騙詞法可以在運行時修改詞法作用域,但是會導(dǎo)致性能下降智绸。

  • eval(...)函數(shù)(在嚴(yán)格模式或ES6中被限制野揪,不建議使用)
    接受一個字符串參數(shù),可以在你寫的代碼中用程序生成代碼并運行瞧栗,就好像代碼是寫在那個位置一樣斯稳。如:

    function foo(str,a){
        eval(str);
        console.log(a,b);
    }
    var b=2;
    foo("var b=3;",1);//1 3
    

    eval(...)通常用來執(zhí)行動態(tài)創(chuàng)建的代碼。

  • with關(guān)鍵字(在嚴(yán)格模式或ES6中被禁止使用)
    with通常被當(dāng)作重復(fù)引用同一個對象中的多個屬性的快捷方式迹恐,可以不需要重復(fù)引用對象本身挣惰。

    function foo(obj){
        with(obj){
            a=3;
        }
    }
    var o1={a:2};
    var o2={b:2};
    foo(o1);
    foo(o2);
    console.log(o1.a);//3
    console.log(o2.a);//undefined
    console.log(a);//3
    

    在上面的代碼中,with會在代碼執(zhí)行時動態(tài)地延長作用域鏈(另外一個延長作用域鏈的方法是try-catch語句塊中的catch塊)系草,因為o2沒有a屬性通熄,所以通過LHS查詢,引擎在全局環(huán)境創(chuàng)建了一個變量a并將3賦值給a找都,所以o2.a為undefined唇辨。

    這里有個要注意的問題就是,訪問變量和訪問對象的屬性是不一樣的:

    1. 訪問變量時會LHS查詢和RHS查詢能耻,在嵌套的作用域鏈中查詢赏枚。
      賦值或者取值分別按照第一章所說的規(guī)則進行LHS查詢和RHS查詢
    2. 訪問對象的屬性則是通過對象的[[Put]]操作和[[Get]]操作來查找,在整個原型鏈([[prototype]]鏈)查找
      賦值時晓猛,通過[[Put]]操作饿幅,若變量存在則將新的值賦值給變量(實際上情況很復(fù)雜,詳見第二部分第2章和第5章戒职,p.117)栗恩,若不存在,則為該對象創(chuàng)建該屬性變量并賦值洪燥;取值時磕秤,通過[[Get]]操作取,若沒有找到則遍歷原型鏈捧韵,還是沒有找到則返回undefined市咆。

    所以上面代碼改成下面的就會輸出不同結(jié)果:

    function foo(obj){
        obj.a=3;
    }
    var o1={a:2};
    var o2={b:2};
    foo(o1);
    foo(o2);
    console.log(o1.a);//3
    console.log(o2.a);//3
    console.log(a);//ReferenceError: a is not defined(即a未聲明undeclared)
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市再来,隨后出現(xiàn)的幾起案子蒙兰,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搜变,死亡現(xiàn)場離奇詭異采缚,居然都是意外死亡,警方通過查閱死者的電腦和手機痹雅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門仰担,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绩社,你說我怎么就攤上這事摔蓝。” “怎么了愉耙?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵贮尉,是天一觀的道長。 經(jīng)常有香客問我朴沿,道長猜谚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任赌渣,我火速辦了婚禮魏铅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坚芜。我一直安慰自己览芳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布鸿竖。 她就那樣靜靜地躺著沧竟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缚忧。 梳的紋絲不亂的頭發(fā)上悟泵,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音闪水,去河邊找鬼糕非。 笑死,一個胖子當(dāng)著我的面吹牛球榆,可吹牛的內(nèi)容都是我干的峰弹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼芜果,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了融师?” 一聲冷哼從身側(cè)響起右钾,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后舀射,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窘茁,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年脆烟,在試婚紗的時候發(fā)現(xiàn)自己被綠了山林。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡邢羔,死狀恐怖驼抹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拜鹤,我是刑警寧澤框冀,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站敏簿,受9級特大地震影響明也,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惯裕,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一温数、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜻势,春花似錦撑刺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至败许,卻和暖如春王带,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背市殷。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工愕撰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人醋寝。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓搞挣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親音羞。 傳聞我的和親對象是個殘疾皇子囱桨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點點福利:阿里云產(chǎn)品券嗅绰,享受所有官網(wǎng)優(yōu)惠舍肠,并抽取幸運大...
    HetfieldJoe閱讀 2,396評論 0 11
  • 特別說明搀继,為便于查閱,文章轉(zhuǎn)自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 559評論 0 3
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)翠语,也就是一...
    悟名先生閱讀 4,149評論 0 13
  • 一肌括、理解js作用域 1点骑、作用域:作用域是一套規(guī)則,用于確定在何處以及如何查找變量(標(biāo)字符)谍夭。2黑滴、LHS查詢:查找的...
    懷念不能閱讀 460評論 0 1
  • “快快快,趕緊幫我發(fā)一下唄慧库□喂颍” “這才什么時候你就買同學(xué)錄了,離畢業(yè)還早呢齐板〕痴埃” “不早了好吧,就一個多月了甘磨∠鹦撸”……...
    權(quán)衡利弊閱讀 297評論 4 1