再探JavaScript作用域
黃金守則第一條:
js沒有塊級作用域(你可以自己閉包或其他方法實(shí)現(xiàn)),只有函數(shù)級作用域,函數(shù)外面的變量函數(shù)里面可以找到,函數(shù)里面的變量外面找不到。
first try:
這是為什么呢??
var a = 10; function aaa(){//step-4 alert(a);//step-5->執(zhí)行alert,此時(shí)只能找到外面的a=10故彈框10 } function bbb(){//step-2 var a = 20; aaa();//step-3 } //定義了函數(shù)沒啥用,調(diào)用才是真格的所以這里是step-1 bbb();//step-1
其實(shí)原理大家都懂,應(yīng)該就是易錯(cuò)而已,萬變不離其綜。
second try:
這是為什么呢? 因?yàn)榻oa賦值b的時(shí)候,b還沒有定義,所以a是undefined,b是10.
黃金守則第二條:
變量的查找是就近原則,去尋找var定義的變量,當(dāng)就近沒有找到的時(shí)候就去查找外層。
look:
這是為什么呢、? 這里面有兩個(gè)原因,一是預(yù)解析,二是就近查找。
var a=10; function aaa(){ alert(a);//undefined,查找a的時(shí)候會(huì)現(xiàn)在函數(shù)內(nèi)查找,由于預(yù)解析的作用,此時(shí)的a是undefined,因此永遠(yuǎn)不會(huì)去查找外面的10了 var a = 20; /*預(yù)解析 var a alert(a); var a = 20;*/ } aaa();
attention:
這個(gè)吧,就驗(yàn)證了第二條,雖然是就近原則,但是是就近找var聲明的變量,這個(gè)是因?yàn)闆]有var聲明的變量是全局的,這里只是修改了a的值。所以上面就是因?yàn)樵诤瘮?shù)內(nèi)沒找到var的a,于是到外面去找了,一找就找到了,于是a就alert出10了;不過沒錯(cuò)的是a=20后,a確實(shí)為20了,只不過alert的時(shí)候還沒有執(zhí)行到那~~
看吧~
下面這個(gè)例子,更加驗(yàn)證了js的函數(shù)作用域 而已:
這是因?yàn)樵赼lert(a)的時(shí)候,bbb函數(shù)中的a確實(shí)為20 ,可是它對于這時(shí)的alert(a)這句話來說是局部的,alert(a)根本找不到bbb函數(shù)中的a,所以在aaa函數(shù)中它找不到a,于是乎去外面找,一找,就找到了10。
黃金守則第三條:
當(dāng)參數(shù)跟局部變量重名時(shí),優(yōu)先級是等同的。
例:
還有:傳參時(shí),基本類型傳值,引用類型傳引用。(但是重新賦值之后就不是這樣了喔)
var a = 5; var b = a; b +=3; alert(a);//5 var a = [1,2,3]; var b=a; b.push(4); alert(a);//[1,2,3,4];
上面代碼沒有問題,但是下面就不一樣啦。
因?yàn)閎被重新賦值了,不指向a了。
此外,參數(shù)與變量的作用域是相似的:
對比上下這兩個(gè):
上面是參數(shù)是基本類型,只傳了值進(jìn)去,下面的傳個(gè)引用類型:(同樣也包含重新賦值的情況)
相關(guān)文章
javascript實(shí)現(xiàn)的圖片切割多塊效果實(shí)例
這篇文章主要介紹了javascript實(shí)現(xiàn)的圖片切割多塊效果,涉及javascript操作圖片及css樣式的技巧,需要的朋友可以參考下2015-05-05微信公眾號(hào)開發(fā) 自定義菜單跳轉(zhuǎn)頁面并獲取用戶信息實(shí)例詳解
這篇文章主要介紹了微信公眾號(hào)開發(fā) 自定義菜單跳轉(zhuǎn)頁面并獲取用戶信息實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12javascript typeof id===''string''?document.getElementById(id
剛開始學(xué)習(xí)js的朋友可能會(huì)有些疑問,其實(shí)這段代碼使用js的三元運(yùn)算符,這樣代碼看起來高大上,最主要是代碼段少2016-11-11javascript 數(shù)組的正態(tài)分布排序的問題
這篇文章主要介紹了javascript 數(shù)組的正態(tài)分布排序的問題的相關(guān)資料,需要的朋友可以參考下2016-07-07JavaScript中的prototype.bind()方法介紹
在JavaScript中,我們經(jīng)常用到函數(shù)綁定,而當(dāng)你需要在另一個(gè)函數(shù)中保持this上下文時(shí),使用Function.prototype.bind()會(huì)很方便2014-04-04