JavaScript作用域

一. 作用域

所有編程語言都有一最基本的功能帆竹,就是能夠存儲(chǔ)變量當(dāng)中的值,并且能在之后對這個(gè)值進(jìn)行訪問或者修改。

那么就會(huì)有下面這么幾個(gè)問題:

1.這些變量存儲(chǔ)在什么地方孝偎??

2.程序需要訪問或者修改變量時(shí)如何找到它們凉敲?邪媳?

一門語言中會(huì)設(shè)計(jì)一套良好的規(guī)則來解決上述的問題捐顷,而這套規(guī)則就就是所謂的作用域。

二 . 詞法作用域與動(dòng)態(tài)作用域

作用域共有兩種主要的工作模型:

1.詞法作用域:大多數(shù)編程語言使用的模型雨效,作用域的規(guī)則是由你在寫代碼時(shí)將變量和塊作用域?qū)懺谀睦餂Q定的迅涮;

2.動(dòng)態(tài)作用域:仍有一部分編程語言在使用(bash,perl)徽龟,作用域是在代碼執(zhí)行過程中確認(rèn)的叮姑;

三. JavaScript的作用域規(guī)則

javascript的作用域規(guī)則屬于詞法作用域即靜態(tài)作用域。

代碼執(zhí)行前會(huì)進(jìn)行的編譯据悔,編譯器負(fù)責(zé)生成可執(zhí)行代碼传透,js引擎執(zhí)行時(shí),遇到變量時(shí)极颓,會(huì)通過查找變量來判斷他是否已聲明過朱盐。查找的過程由作用域進(jìn)行協(xié)助,但是js引擎執(zhí)行怎樣查找菠隆?

當(dāng)前作用域對變量的查找遵循以下兩個(gè)規(guī)則兵琳,首先提出兩個(gè)術(shù)語:

RHS:(retrueve his source value)右查詢,變量出現(xiàn)在賦值操作的右側(cè)骇径;

LHS:左查詢躯肌,變量出現(xiàn)在賦值操作的左側(cè);

注: 并不全是 "=賦值操作符的左側(cè)和右側(cè)";

// 如下面的代碼

function ?foo(a){

// 被調(diào)用時(shí)會(huì)有a = 2 ? 對a進(jìn)行的LHS

console.log(a); ?// console RHS ? 和 ?a RHS

}?

foo(2); ? // foo()進(jìn)行的是 RHS

作用域的嵌套

當(dāng)在當(dāng)前作用域查找不到該變量時(shí)破衔,會(huì)繼續(xù)向上當(dāng)前作用域的上一級作用域查找清女,當(dāng)?shù)诌_(dá)最外層的全局作用域時(shí),無論找到還是沒找到晰筛,查找過程都會(huì)停止嫡丙。

js中目前只有全局作用域和函數(shù)作用域,作用域的嵌套也只會(huì)出現(xiàn)這兩種的情況下读第,

注:es6中引入了塊級作用域迄沫。

最后,讓我們看一個(gè)《JavaScript權(quán)威指南》中的例子:

var scope="global scope";

function ?checkscope(){

var ?scope="local scope";

function ?f(){

return scope;

}

return ?f();

}

checkscope();

var ?scope="global scope";

function ?checkscope(){

var ?scope="local scope";

function ?f(){

return ?scope;

}

return ?f;

}

checkscope()();

猜猜兩段代碼各自的執(zhí)行結(jié)果是多少卦方?

這里直接告訴大家結(jié)果羊瘩,兩段代碼都會(huì)打印’local scope’。

引用權(quán)威指南的回答就是:

JavaScript函數(shù)的執(zhí)行用到了作用域鏈盼砍,這個(gè)作用域鏈?zhǔn)窃诤瘮?shù)定義的時(shí)候創(chuàng)建的尘吗。嵌套的函數(shù)f()定義在這個(gè)作用域鏈里,其中的變量scope一定是局部變量浇坐,不管何時(shí)何地執(zhí)行函數(shù)f()睬捶,這種綁定在執(zhí)行f()時(shí)依然有效。

但是在這里真正想讓大家思考的是近刘,兩段代碼執(zhí)行的結(jié)果一樣擒贸,但是兩段代碼究竟有哪些不同呢臀晃?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市介劫,隨后出現(xiàn)的幾起案子徽惋,更是在濱河造成了極大的恐慌,老刑警劉巖座韵,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件险绘,死亡現(xiàn)場離奇詭異,居然都是意外死亡誉碴,警方通過查閱死者的電腦和手機(jī)宦棺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黔帕,“玉大人代咸,你說我怎么就攤上這事〕苫疲” “怎么了呐芥?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長慨默。 經(jīng)常有香客問我贩耐,道長弧腥,這世上最難降的妖魔是什么厦取? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮管搪,結(jié)果婚禮上虾攻,老公的妹妹穿的比我還像新娘。我一直安慰自己更鲁,他們只是感情好霎箍,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著澡为,像睡著了一般漂坏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上媒至,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天顶别,我揣著相機(jī)與錄音,去河邊找鬼拒啰。 笑死驯绎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谋旦。 我是一名探鬼主播剩失,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼屈尼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拴孤?” 一聲冷哼從身側(cè)響起脾歧,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乞巧,沒想到半個(gè)月后涨椒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绽媒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年蚕冬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片是辕。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡囤热,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出获三,到底是詐尸還是另有隱情旁蔼,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布疙教,位于F島的核電站棺聊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贞谓。R本人自食惡果不足惜限佩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望裸弦。 院中可真熱鬧祟同,春花似錦、人聲如沸理疙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窖贤。三九已至砖顷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赃梧,已是汗流浹背滤蝠。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留槽奕,地道東北人几睛。 一個(gè)月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像粤攒,于是被迫代替她去往敵國和親所森。 傳聞我的和親對象是個(gè)殘疾皇子囱持,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

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