js中作用域問(wèn)題

轉(zhuǎn)載地址:
http://blog.csdn.net/itzhengmaolin/article/details/54565201

作用域:在一定的范圍內(nèi)多艇,對(duì)其進(jìn)行讀洁墙、寫操作“js解析器”執(zhí)行的過(guò)程至少2步:1实蔽、"找一些東西":比如 var 别垮、function涯贞、參數(shù)2庭瑰、逐行解讀代碼例:
alert(a);var a=1;function fn1(){ alert(2);}
解析過(guò)程:
1星持、JS的預(yù)解析過(guò)程 原則:遇到重名的:只留一個(gè)(變量和函數(shù)重名了,就只留下函數(shù)弹灭。無(wú)論變量在上還是函數(shù)在上督暂,與上下是沒(méi)關(guān)系的,跟有值沒(méi)值有關(guān)系穷吮。因?yàn)樽兞?undefined逻翁,函數(shù)=整個(gè)函數(shù)塊,相比之下有具體值的級(jí)別更大)
找到var關(guān)鍵字捡鱼,然后定義其變量名等于undefined八回,不會(huì)管后面的值(在"JS解析器"執(zhí)行的過(guò)程中,所有的變量都等于未定義) 如:a=undefined
找到function關(guān)鍵字驾诈,然后用其函數(shù)名等于其整個(gè)函數(shù)塊缠诅。(所有的函數(shù),在正式運(yùn)行代碼之前乍迄,都提前賦了一個(gè)值管引,這個(gè)值為整個(gè)函數(shù)塊) 如:fn1=function fn1(){alert(2);}

2、逐行解讀代碼過(guò)程: 表達(dá)式可以修改"預(yù)解析"的值闯两。函數(shù)的聲明不屬于表達(dá)式汉匙,改變不了什么東西這個(gè)過(guò)程遵循"從上往下,從左往右"的順序執(zhí)行生蚁。當(dāng)執(zhí)行一句完畢后噩翠,到倉(cāng)庫(kù)中查找是否有這個(gè)"東西"(變量、函數(shù)等)邦投。如果有則彈出其一開(kāi)始在倉(cāng)庫(kù)的值(使用alert方法)遇到表達(dá)式(=+ - * / % ++ -- ! 參數(shù)……等即能改變值的東西)簡(jiǎn)單來(lái)說(shuō)伤锚,找var 、function志衣、參數(shù)屯援,并將變量賦值為undefined、函數(shù)名=整個(gè)函數(shù)念脯,然后將他們存儲(chǔ)在倉(cāng)庫(kù)中狞洋,在進(jìn)行逐行解讀代碼的時(shí)候,在倉(cāng)庫(kù)中提取或修改

練習(xí):



解析過(guò)程
1绿店、找關(guān)鍵字(var吉懊、function庐橙、參數(shù))找到37行的"var a",執(zhí)行過(guò)程:a=undefined找到39行的"function a(){alert(2);}",執(zhí)行過(guò)程:a=function a(){alert(2);}因?yàn)閭}(cāng)庫(kù)里有重名的a,所以要比較優(yōu)先級(jí),值為函數(shù)的大于值為未定義借嗽,所以執(zhí)行過(guò)程為a=function a(){alert(2);}找到41行的"var a ",執(zhí)行過(guò)程:a=undefined因?yàn)閭}(cāng)庫(kù)里有重名的a,所以要比較優(yōu)先級(jí)态鳖,值為函數(shù)的大于值為未定義,所以執(zhí)行過(guò)程為a=function a(){alert(2);}找到43行的"function (){alert(4);}",執(zhí)行過(guò)程:a=function (){alert(4);}因?yàn)閭}(cāng)庫(kù)里有重名的a,所以要比較優(yōu)先級(jí)恶导,值同為函數(shù)則比較先后浆竭,后面的覆蓋前面的,所以執(zhí)行過(guò)程為a=function a(){alert(4);}2惨寿、逐行解析:從上往下邦泄,從左到右依次執(zhí)行代碼。從36行開(kāi)始裂垦,a的一開(kāi)始值為function a(){alert(4);}執(zhí)行37行時(shí)顺囊,修改倉(cāng)庫(kù)中a的值,則變?yōu)?執(zhí)行39行時(shí)缸废,并不影響a的值,所以a的值還是1后面亦是如此

一個(gè)頁(yè)面兩個(gè)script標(biāo)簽驶社,瀏覽器遇到script標(biāo)簽會(huì)用"js解析器"來(lái)解析企量,只有解析完第一個(gè)script標(biāo)簽的內(nèi)容后在執(zhí)行下一個(gè)script標(biāo)簽內(nèi)的內(nèi)容,所以下面alert(a); 會(huì)報(bào)錯(cuò) a is no defined亡电。



這就是當(dāng)引用別人寫的jQuery庫(kù)時(shí)届巩,在對(duì)其修改

var a = 1;
function fn1()
      {
         alert(a); //undefined var a = 2;
       }
fn1();
alert(a);           

//1解析過(guò)程:
1、預(yù)解析:a=undefined;fn1=function fn1(){ alert(a); var a = 2;}
2份乒、逐行解析;a=1遇到函數(shù)調(diào)用fn1() --函數(shù)也是一個(gè)局部的域恕汇,只要是一個(gè)域就會(huì)發(fā)生預(yù)解析和逐行解讀代碼。相當(dāng)于其有一個(gè)小的倉(cāng)庫(kù)或辖●ⅲ可以理解為1個(gè)大倉(cāng)庫(kù)包含著1個(gè)小倉(cāng)庫(kù),大倉(cāng)庫(kù)里的a和小倉(cāng)庫(kù)里的a是不同的世界颂暇,互不影響缺谴。函數(shù)調(diào)用屬于表達(dá)式 函數(shù)里的預(yù)解析: a=undefined; //這里的a是局部的,外面的是全局的耳鸯,兩者沒(méi)關(guān)系 函數(shù)里的逐行解析: 執(zhí)行函數(shù)里的alert(a); 先找局部倉(cāng)庫(kù)里的a湿蛔,所以彈出undefined 在執(zhí)行函數(shù)里的var a=2; 所以局部里的a=2县爬,并沒(méi)有影響全局中的a=1 函數(shù)執(zhí)行完畢后會(huì)有垃圾回收機(jī)制等
函數(shù)調(diào)用完畢后阳啥,繼續(xù)全局的逐行解析

var a = 1;function fn1(){alert(a); // 1a = 2;      

//注意這里沒(méi)用var聲明}fn1();alert(a); // 2函數(shù)里的預(yù)解析過(guò)程為空,執(zhí)行函數(shù)里的逐行解析代碼:當(dāng)執(zhí)行到alert(a);沒(méi)找到a财喳,會(huì)順著函數(shù)的作用域跳到上一級(jí)(從子級(jí)作用域返回到父級(jí)作用域的過(guò)程叫作用域鏈察迟,由里到外找)。執(zhí)行到"a=2"時(shí),發(fā)現(xiàn)小倉(cāng)庫(kù)里沒(méi)有a卷拘,則由里到外找喊废,找到其父級(jí)有a,則修改a的值為2
所以栗弟,加var與不加var的區(qū)別體現(xiàn)出來(lái)了污筷。不加var,會(huì)修改全局變量的值

var a = 1;function fn1(a){alert(a); // undefineda = 2;}fn1();alert(a); // 1

參數(shù)本質(zhì)就是一個(gè)局部變量乍赫。跟上面的其中一種情況(如下)很類似函數(shù)預(yù)解析時(shí)沒(méi)有發(fā)現(xiàn)var瓣蛀、function ,卻發(fā)現(xiàn)了參數(shù)雷厂,所以a=undefined惋增。然后逐行解讀代碼,當(dāng)讀到"alert(a);"改鲫,執(zhí)行結(jié)果為undefined當(dāng)讀到"a=2;",它會(huì)就近找小倉(cāng)庫(kù)里有沒(méi)有a诈皿,執(zhí)行結(jié)果為a=2,全局的a還是1不影響

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末像棘,一起剝皮案震驚了整個(gè)濱河市稽亏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缕题,老刑警劉巖截歉,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異烟零,居然都是意外死亡瘪松,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門锨阿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)宵睦,“玉大人,你說(shuō)我怎么就攤上這事墅诡∽捶桑” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵书斜,是天一觀的道長(zhǎng)诬辈。 經(jīng)常有香客問(wèn)我,道長(zhǎng)荐吉,這世上最難降的妖魔是什么焙糟? 我笑而不...
    開(kāi)封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮样屠,結(jié)果婚禮上穿撮,老公的妹妹穿的比我還像新娘缺脉。我一直安慰自己,他們只是感情好悦穿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布攻礼。 她就那樣靜靜地躺著,像睡著了一般栗柒。 火紅的嫁衣襯著肌膚如雪礁扮。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天瞬沦,我揣著相機(jī)與錄音太伊,去河邊找鬼。 笑死逛钻,一個(gè)胖子當(dāng)著我的面吹牛僚焦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播曙痘,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼芳悲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了边坤?” 一聲冷哼從身側(cè)響起名扛,我...
    開(kāi)封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惩嘉,沒(méi)想到半個(gè)月后罢洲,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體踢故,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡文黎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了殿较。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耸峭。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖淋纲,靈堂內(nèi)的尸體忽然破棺而出劳闹,到底是詐尸還是另有隱情,我是刑警寧澤洽瞬,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布本涕,位于F島的核電站,受9級(jí)特大地震影響伙窃,放射性物質(zhì)發(fā)生泄漏菩颖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一为障、第九天 我趴在偏房一處隱蔽的房頂上張望晦闰。 院中可真熱鬧放祟,春花似錦、人聲如沸呻右。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)声滥。三九已至眉撵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間醒串,已是汗流浹背执桌。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芜赌,地道東北人仰挣。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像缠沈,于是被迫代替她去往敵國(guó)和親膘壶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • 第一章: JS簡(jiǎn)介 從當(dāng)初簡(jiǎn)單的語(yǔ)言洲愤,變成了現(xiàn)在能夠處理復(fù)雜計(jì)算和交互颓芭,擁有閉包、匿名函數(shù)柬赐, 甚至元編程等...
    LaBaby_閱讀 1,640評(píng)論 0 6
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品亡问,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式肛宋。簡(jiǎn)單...
    舟漁行舟閱讀 7,718評(píng)論 2 17
  • 變量和函數(shù)的提升可以分成兩步: 1 js先預(yù)解析:把變量和函數(shù)聲明提升到作用域頂端州藕,我理解的意思是在瀏覽器中找一些...
    miner敏兒閱讀 257評(píng)論 0 0
  • 39 又一次樊登讀書會(huì)線下活動(dòng),這次的主角變成了小朋友酝陈,人家原是要求3到7歲的孩子參加床玻,到場(chǎng)的還是有十歲孩...
    錦莉閱讀 1,636評(píng)論 1 1
  • 當(dāng)你第一次打開(kāi)一款應(yīng)用的時(shí)候常常會(huì)看到精美的引導(dǎo)頁(yè)設(shè)計(jì)锈死,它們?cè)谀阄词褂卯a(chǎn)品之前提前告知你產(chǎn)品的主要功能與特點(diǎn),第一...
    Air7777777閱讀 10,972評(píng)論 9 109