首先,上幾道我編寫的 JS 題,作為分析的樣本。 請根據(jù)代碼,選擇正確的選項。 第一題 alert(a); } test(); A. 0 B. null 第二題 alert(a); a = 100; } test(); A. 0 B. null 第三題 alert(a); var a = 100; } test(); A. 0 B. 100 前兩題沒啥好說的,之前關(guān)于閉包的博文中已經(jīng)講得很清楚了,函數(shù) test 形成了自己的閉包,所以能夠訪問到全局作用域里面的變量 a 。 第三題可能有人會覺得有點奇怪,為啥是 undefined 的呢?雖然我在閉包內(nèi)定義了 var a = 100 , 可是它分明是在 alert 語句的下面啊,所以不是應該先打印出全局作用域里的 a 嗎? 不要著急,我們來講一個故事吧,當你將這段代碼放進瀏覽器跑起來的那一個瞬間,到底發(fā)生了哪些有趣的事情。 當你刷新瀏覽器之后。。。 編譯器看到了這句話, 編譯器 : ‘nice,發(fā)現(xiàn)一個活的 a 變量,我要把它丟到作用域中去囚禁它! 于是 編譯器 : nice,發(fā)現(xiàn)一個活的 test 變量,我擦,還是一個函數(shù)類型,作用域,又有新貨了! 作用域 : ‘可以呀,小伙子!’ 于是: 編譯器順便把 test 函數(shù)給“扒”了,又發(fā)現(xiàn)里面有這么一句話: 編譯器:小樣,別以為你躲在 test 函數(shù)的私有作用域里面我就找不到你了,全局作用域中的a和你沒關(guān)系,你也進去! 編譯器:嗯,沒找到什么變量定義了,好,我去休息啦。 js引擎:終于輪到我出場了。 a(全局): js引擎大哥,給我吃飯吧 。。。 js引擎: 吵啥子吵,先給你個undefined,吃這個吧 。 于是: a(全局):只要心中有夢想,undefined也是嚼勁十足! 同樣的,test 變量 也吃上了飯。 a(局部) : 大哥,我別這么偏袒全局作用域啊,同樣是 a 變量,我也要吃飯?。?br>js引擎:你在函數(shù)內(nèi)部,我還沒執(zhí)行函數(shù)呢,怎么給你吃飯呀,先給你個undefined吧。 js引擎:我要開始執(zhí)行test函數(shù)了。 js引擎:作用域在嗎,我知道alert是一個內(nèi)置函數(shù),當我在執(zhí)行它的時候,發(fā)現(xiàn)有一個a變量作為參數(shù)傳進去了,你見過它么? 作用域:有啊,就那個剛才還吵著要吃飯的家伙。 js引擎:哦,我想起來了,現(xiàn)在它估計還在啃undefined呢,行吧,你把它給我吧,alert方法點名要找他呢。 作用域:OK。 故事到這里就講完了,現(xiàn)在你應該明白為什么第三題的答案是undefined了吧。 附加題: alert(a); if(false){ var a = 100; } } test(); A. 0 別猶豫,大聲說出你的答案吧! 可以將答案寫在評論中哦! 微信群『我們是前端』 后臺回復“入群”即可受邀哦(備注:前端) 為您提供最優(yōu)質(zhì)的內(nèi)容 |
|