什么是作用域


關(guān)于《你不知道的javascript》

編譯原理

關(guān)于編程語言蒲稳,我們會(huì)想到的一個(gè)基本知識(shí)點(diǎn)是:首先它可以存儲(chǔ)變量辑鲤,其次它能夠?qū)@個(gè)變量進(jìn)行訪問與修改捂刺。對(duì)于javascript递胧,實(shí)現(xiàn)這些功能多于其編譯器霎烙、引擎與作用域有關(guān)撬讽。那么我們今天就先從編譯器簡(jiǎn)單說起吧蕊连。
對(duì)于一般的編譯語言,編譯過程多在編碼前期執(zhí)行游昼,通過分詞==語法分析==代碼生成來將代碼編譯成機(jī)器指令甘苍。而對(duì)于js來說,編譯的過程也是比較復(fù)雜的烘豌,其中還涉及到很多的優(yōu)化項(xiàng)目载庭,但是一般來說,它沒有那么多的編譯時(shí)間廊佩,只會(huì)在執(zhí)行前對(duì)作用域中的代碼進(jìn)行編譯囚聚。

工作機(jī)制

以var a=2舉個(gè)例子吧,介紹一下編譯器與引擎和作用域怎樣工作的

  • 首先标锄,編譯器看到了var a顽铸,向作用域來問a是否聲明過,是料皇,則無視谓松,繼續(xù)生成后面的代碼,否践剂,向作用域中添加a這個(gè)變量鬼譬。后續(xù)以代碼生成方式,生成a=2這個(gè)代碼逊脯,但沒有什么實(shí)際意義优质。
  • 引擎開始工作,對(duì)于a=2的賦值語句军洼,先向作用域查找a變量巩螃,確認(rèn)a存在,將2賦值于a歉眷,如果這里不存在牺六,則會(huì)舉爪報(bào)錯(cuò)颤枪。

這里我們可以看到編譯器與引擎都會(huì)與作用域有相應(yīng)的交集汗捡,但是因?yàn)榫庉嬈髦恍枰袛嗍欠裥杪暶饕约白饔糜蚵暶靼蛇@樣的作用,好像體現(xiàn)不了作用域的重要性畏纲,作者就不說他兩之間的事了扇住,轉(zhuǎn)向一個(gè)更重要的地方,引擎如何在作用域中查找變量盗胀,以及確認(rèn)其是在哪一層--好像確實(shí)重要些艘蹋,其實(shí)就是不好理解嘛,就找了兩個(gè)方法來幫助我們?nèi)ダ斫庖幌逻@樣的查找機(jī)制票灰。

那些賦值左右的事情

我們看到的表達(dá)式女阀,其實(shí)大多只有兩種宅荤,一種是直接有‘=’的賦值語句,一種是純粹的函數(shù)執(zhí)行:console.log(‘就醬’)浸策。

  • 那么對(duì)于賦值語句a=b來說冯键,對(duì)于a的查詢,我們可以知道庸汗,它只需要將告訴引擎==‘我就在這惫确,我的值你添加就好啦’,但是對(duì)于b蚯舱,我們需要先找到有沒有b改化,即是否聲明過,沒有聲明枉昏,抱歉陈肛,你出現(xiàn)了ReferenceError錯(cuò)誤啦。同樣兄裂,如果是console.log(b)燥爷,也是先查找到源頭,看是否聲明懦窘。
  • 這里可以看出我們大致可以將在作用域中的查找變成兩種思路:LHS查詢和RHS查詢前翎,可以記憶為賦值左右的小竅門--為什么這么叫就不造啦。左邊的是LHS畅涂,a=港华。。午衰。立宜,我們只需要知道a存在,能找到它-即賦值的目標(biāo)臊岸。右邊的RHS橙数,a=b中的b可以理解為賦值的源頭,要確定它是否被聲明帅戒,是否有值灯帮。

RHS與LHS的意義何在

  • 兩種查詢思路,更方面我們知道變量在作用域中是如何被查找到的
  • 區(qū)別:非嚴(yán)格模式下逻住,a=2沒有聲明a一點(diǎn)毛病沒有钟哥,但是a=b,b沒有聲明就引用錯(cuò)誤啦瞎访;而且如果var b,a腻贰;a.b這種的b也是不行噠,會(huì)說類型錯(cuò)誤==TypeError
  • 然后就是對(duì)于多層嵌套的作用域扒秸,我們可以很清楚的用這兩種方式去找變量啦播演,不著急冀瓦。

作用域是什么

說了半天,那么作用域到底是什么写烤,書里那一句話還不錯(cuò):作用域就是一種方法咕幻,用于確定在何處以及如何查找變量。

小羅嗦

寫文好慢的速度顶霞,那就隨便說說啦肄程,書中的觀點(diǎn)自己的話,有問題大家評(píng)論呀选浑,一起討論討論

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末声畏,一起剝皮案震驚了整個(gè)濱河市温数,隨后出現(xiàn)的幾起案子祸穷,更是在濱河造成了極大的恐慌臼闻,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隧膘,死亡現(xiàn)場(chǎng)離奇詭異代态,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)疹吃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門蹦疑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人萨驶,你說我怎么就攤上這事歉摧。” “怎么了腔呜?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵叁温,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我核畴,道長(zhǎng)膝但,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任谤草,我火速辦了婚禮跟束,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咖刃。我一直安慰自己泳炉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布嚎杨。 她就那樣靜靜地躺著,像睡著了一般氧腰。 火紅的嫁衣襯著肌膚如雪枫浙。 梳的紋絲不亂的頭發(fā)上刨肃,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音箩帚,去河邊找鬼真友。 笑死,一個(gè)胖子當(dāng)著我的面吹牛紧帕,可吹牛的內(nèi)容都是我干的盔然。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼是嗜,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼愈案!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鹅搪,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤站绪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后丽柿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恢准,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年甫题,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了馁筐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坠非,死狀恐怖眯漩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情麻顶,我是刑警寧澤赦抖,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站辅肾,受9級(jí)特大地震影響队萤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矫钓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一要尔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧新娜,春花似錦赵辕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至私杜,卻和暖如春蚕键,著一層夾襖步出監(jiān)牢的瞬間救欧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工锣光, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留笆怠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓誊爹,卻偏偏與公主長(zhǎng)得像蹬刷,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子频丘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持椎镣,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券诈火,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 3,220評(píng)論 5 34
  • 特別說明,為便于查閱惊科,文章轉(zhuǎn)自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 578評(píng)論 0 0
  • 編譯原理 傳統(tǒng)編譯語言 詞法分析:將由字符組成的字符串分解成(對(duì)編譯語言來說)有意義的代碼塊拍摇,這些代碼塊被稱為詞法...
    Daniel_Y閱讀 221評(píng)論 0 0
  • 如果我的文章對(duì)你有用充活,請(qǐng)給我一個(gè)贊,讓我有繼續(xù)堅(jiān)持的動(dòng)力/微笑蜡娶。原創(chuàng)文章混卵,此文章僅供學(xué)習(xí)參考使用,歡迎訪問我的個(gè)人...
    我就是z閱讀 482評(píng)論 0 3
  • 什么是作用域和執(zhí)行上下文 說到 Javascript 中的作用域窖张,通常一同出現(xiàn)的還有一個(gè)執(zhí)行上下文(executi...
    唯泥Bernie閱讀 3,297評(píng)論 2 6