淺析JavaScript中作用域和作用域鏈
學習js,肯定要學習作用域,js作用域和其他的主流語言的作用域還存在很大的區(qū)別。
一.js沒有塊級作用域。
js沒有塊級作用域,就像這樣:
if(){ var a = 100; console.log(a) //輸出100 } console.log(a) //輸出100
js中像if,for,switch之類的語句,他們包含的代碼塊里面的變量,在代碼塊外面也能被讀取,所以說,js沒有塊級作用域。
二.js的全局變量
js中規(guī)定,全局變量都可以看作是window的屬性,而且全局變量能夠被所有的代碼塊讀取。
var a = 10; function() { b = 20; console.log(a); //輸出10; } console.log(b); //輸出20;
雖然在匿名函數(shù)中對a沒有定義,但是由于a是全局變量,所以其他任何的代碼塊都能夠讀取a的值。在一個復(fù)雜的項目中,全局變量如果操作不慎,很有可能帶來重大的bug。所以在平時寫代碼的時候,應(yīng)該盡量避免使用全局變量!對于一個變量來說,如果沒有用var來聲明的話,那么會自動認為是全局變量,因此,在書寫中,一定不能漏寫var。
三.js的局部變量
js中的全局變量,很容易使代碼存在問題,所以我們應(yīng)該明確區(qū)分全局變量和局部變量!局部變量只在他所在的函數(shù)內(nèi)部讀取,在函數(shù)外部卻無法讀取這個變量。
function doSomething(){ var blogName="智軒資本"; function innerSay(){ alert(blogName); } innerSay(); } alert(blogName); //undefined innerSay(); //undefined
四.js的作用域鏈問題
由于js存在全局變量和局部變量,在調(diào)用一個變量是,會對他的作用域鏈進行查找,如果函數(shù)內(nèi)部定義了這個變量,那么取該變量的值,如果沒有,那么向上一層查找,如果找到了,就獲取這個值,如果還沒找到,繼續(xù)往上層查找,直到找到位置,如果找到最后也沒找到,那么該變量的值為undefined。
先看一個例子:
var myName = '智軒資本'; function scoap() { console.log(myName); var myName = "zhixuan"; console.log(myName); console.log(age); } scoap();
先分析一下這個例子,scoap()將調(diào)用這個函數(shù),第一個console.log(name),會對name的值進行原型鏈查找,首先看函數(shù)scoap內(nèi)部是否進行了定義,發(fā)現(xiàn)在函數(shù)內(nèi)部對name進行了定義,那么第一個console.log(name)將不再往上層查找!那么第一個console.log(name)的值是不是就是“zhixuan”了呢?no!no!no!由于第一個console.log(name)時,對name還沒有賦值,所以,第一個console.log(name)為undefined,第二個console.log(name)為“zhixuan”!
再看一個例子:
var a = 10; function zhixuan() { console.log(a); } function ziben() { var a = 20; zhixuan(); } ziben();
這次console.log(a)的值為多少呢?首先執(zhí)行ziben()函數(shù),里面定義了a為20,再執(zhí)行zhixuan()函數(shù),要求輸出a的值,由于作用域在函數(shù)定義的那一瞬間就決定了,所以,zhixuan()函數(shù)會向上查找到a的全局變量,即var a=10,而不是演著ziben()里的作用域查找!所以console.log(a)為10.
當然,我的這些理解比較淺,如果想要繼續(xù)深入,推薦閱讀:http://www.dbjr.com.cn/article/57393.htm
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,同時也希望多多支持腳本之家!
相關(guān)文章
Javascript 正則表達式實現(xiàn)為數(shù)字添加千位分隔符
在項目中做貨幣轉(zhuǎn)換的時候經(jīng)常需要可以實現(xiàn)自動格式化輸入的數(shù)字,自動千位分隔符,在網(wǎng)上也看到一些其他網(wǎng)友的實現(xiàn)的代碼,感覺都不是太滿意,于是自己研究了下,分享給大家。2015-03-03javascript 用記憶函數(shù)快速計算遞歸函數(shù)
摘自《JavaScript: The Good Parts》,作為讀書筆記備用。對于追求執(zhí)行效率的朋友可以參考下。2010-03-03javascript實現(xiàn)div的顯示和隱藏的小例子
這篇文章介紹了在JS中實現(xiàn)DIV顯示和隱藏的實例,需要的朋友可以參考一下2013-06-06