相信學(xué)過javascript的童鞋們都知道作用域在在其中的重要性了垮耳,然而很多人在剛接觸過作用域后敌卓,對(duì)于作用域的理解,可能都會(huì)有點(diǎn)似懂非懂抹缕,今天樓主就對(duì)
作用域進(jìn)行詳細(xì)講解澈蟆,并附有各種面試考題例子,希望對(duì)于看過這篇文章的童鞋能有所幫助卓研。
首先:我們?cè)谧置嫔侠斫庀伦饔糜颉?/h3>
作用:指“讀 寫”趴俘。
域:指“空間、范圍奏赘、區(qū)域......”寥闪。
所以作用域可以理解為:在一個(gè)范圍區(qū)域內(nèi)進(jìn)行讀寫操作。
接下來(lái):我們來(lái)模擬一下瀏覽器對(duì)于javascript的解析過程磨淌。
首先我們要了解瀏覽器對(duì)javascript的解析是從上往下開始逐行解析的疲憋。
對(duì)于瀏覽器:
可將瀏覽器內(nèi)部模擬出一個(gè)“JS解析器”
(1):首先進(jìn)行JS的預(yù)解析
解析器會(huì)“找一些東西”:var(變量) function(函數(shù)) 參數(shù)
比如找到一個(gè)變量a-> a=...(undefined)
所有的變量,在正式運(yùn)行代碼之前梁只,都會(huì)提前賦一個(gè)值:undefined缚柳。
或者比如找到一個(gè)函數(shù)fn1-> fn1=function fn1(){alert(1);}
所有的函數(shù)埃脏,在正式運(yùn)行代碼之前,都是整個(gè)函數(shù)塊喂击。
遇到重名只留下一個(gè)剂癌,變量和函數(shù)名重名了,就只留下函數(shù)
(2):解析器再逐行解讀代碼:
碰到表達(dá)式可以修改預(yù)解析里的值翰绊。
例:表達(dá)式:= - * / % ++ -- 佩谷! 參數(shù)......
一個(gè)變量如果作用于整個(gè)作用域,則稱這個(gè)變量為全局變量监嗜,作用域?yàn)槿趾瘮?shù)
一個(gè)變量如果只作用于一個(gè)函數(shù)內(nèi)部谐檀,則稱這個(gè)變量為局部變量,作用域?yàn)榫植亢瘮?shù)
接下來(lái)通過各個(gè)例子裁奇,來(lái)對(duì)作用域進(jìn)行更深刻的理解桐猬。
//樓主就對(duì)第一個(gè)例子進(jìn)行詳細(xì)說明,接下來(lái)的例子希望童鞋們通過自己的理解來(lái)進(jìn)行解答
alert(a); // function a(){alert(2)}
var a=1; //根據(jù)上面的解析過程 首先找到變量和函數(shù),并給
alert(a); // 1 變量賦上未定義刽肠,函數(shù)附上整個(gè)函數(shù)塊溃肪。
function a(){alert(2);} a=... a=function a(){alert(2)}
alert(a); // 1 因?yàn)樽兞棵秃瘮?shù)名重名了,所以只留下函數(shù)音五。
var a=3; a=function a(){alert(2)}
alert(a); // 3 再進(jìn)行逐行解讀代碼
function a(){alert(4);} 碰到表達(dá)式惫撰,可以修改預(yù)解析里的值
alert(a); // 3
接下來(lái)樓主寫下例子和答案,童鞋們可以根據(jù)以上步驟自己進(jìn)行分析躺涝。
var a=1;
function fn1(){
alert(a); //undefined
var a=2;
}
fn1();
alert(a); // 1
/*-----------------------------------*/
var a=1;
function fn1(){
alert(a); // 1
a=2; ? 函數(shù):
} 由里往外找變量
fn1();
alert(a); // 2
/*-----------------------------------*/
var a=1;
function fn1(a){
alert(a); // undefined
a=2; ?
}
fn1();
alert(a); // 1
/*-----------------------------------*/
var a=1;
function fn1(a){
alert(a); // 1
a=2; ?
}
fn1(a);
alert(a); // 1
通過以上例子厨钻,相信大家對(duì)于作用域一定有了更加深刻的理解,那么樓主就出一道小題坚嗜,答案大家可以寫在評(píng)論里夯膀,或者簡(jiǎn)信給我。
<script>
window.onload=function(){
var oBtn=document.getElementsByTagName('input');
for(var i=0;i<3;i++){
oBtn[i].onclick=function(){
alert(i);
}
}
}
</script>