JS基礎(chǔ):作用域

一、作用域概念-預(yù)解析規(guī)則、表達(dá)式

作用域:

:空間甚淡,范圍,區(qū)域……
作用:讀捅厂,寫

瀏覽器——JS解析器:

<script>
alert(a);
var a=1;
function fn1(){alert(2);}
</script>

在瀏覽器專門用來讀取JS的贯卦,我們稱之為"JS解析器":

1)找一些東西:var function 參數(shù)

第一步: a = 未定義 所有的變量,在正式運(yùn)行代碼之前焙贷,都提前賦了一個值:未定義

第二步:fn1=function fn1(){alert(2);}
所有的函數(shù)撵割,在正式運(yùn)行代碼之前,都是整個函數(shù)塊

以上兩步即辙芍,JS的預(yù)解析

【注意】:遇到重名的:只留一個:

1.變量和函數(shù)重名了,就只留下函數(shù)啡彬;

(因?yàn)榈谝粋€未定義羹与,所以留函數(shù))

2.重名的函數(shù),后面的留下庶灿。

【注意】:

  • script(域) 全局變量纵搁,全局函數(shù):
    自上而下
    作用域鏈:子級作用域返回到父級去找,就是作用域鏈往踢。
  • 函數(shù)
    由里向外
  • {}(對象)

2)逐行解讀代碼:

表達(dá)式:= + - * / % ++ -- 腾誉! …… 參數(shù) Number()(能改變值的都是表達(dá)式)

表達(dá)式可以修改預(yù)解析的值!

【注意思考】

<script>
alert(a);
var a=1;
</script>

為什么:用瀏覽器打開峻呕,得到是彈出框提示undefined利职?

【注意思考】

<script>
alert(a);
a=1;
</script>

為什么:用瀏覽器打開,無反應(yīng)瘦癌,打開后臺發(fā)現(xiàn)報錯猪贪?

二、全局與局部作用域解析佩憾、作用域鏈

【面試案例】:

<script>
alert(a);
var a=1;
alert(a);
function a(){alert(2);}
alert(a);
var a = 3;
alert(a);
function a(){alert(4);}
alert(a);
</script>

【結(jié)果】:



【解析】:
1)預(yù)解析:var function 參數(shù)……

 /*a=…未定義
 a=function a(){alert(2);}
 因?yàn)橛龅街孛模褐涣粢粋€(第一個未定義,所以留函數(shù))
變量和函數(shù)重名了,就只留下函數(shù)
 a=function a(){alert(2);}
 a=function a(){alert(4);}
后面的干掉前面的干花,所以留下:a=function a(){alert(4);}*/

a=function a(){alert(4);}
所以得到第一個alert(a)的結(jié)果

2)逐行解讀代碼:
表達(dá)式可以修改預(yù)解析的值妄帘!
所以依據(jù)41行var a =3,第42行

(一)、script(域) 全局變量池凄,全局函數(shù):自上而下抡驼、由里向外

【注意】:

js是單線程,一個域處理完肿仑,再處理另一個域的內(nèi)容:
自上而下,內(nèi)可得外:
【案例1】
<script>
alert(a);//報錯:Uncaught ReferenceError: a is not defined
</script>
##三致盟、調(diào)用局部數(shù)據(jù)、全局聲明尤慰、for嵌套函數(shù)中i取值
<script>
var a =1;   
</script>

【結(jié)果】瀏覽器無效果馏锡,后臺報錯Uncaught ReferenceError: a is not defined

【案例2】
<script>
alert(a);//undefined 因?yàn)樽兞刻嵘?var a =1;
</script>

<script>    
</script>
【案例3】
<script>
var a =1;
</script>

<script>
alert(a);//彈出框1,說明域自上而下 
</script>

(二)伟端、函數(shù)也是一個域(是局部的域)也要進(jìn)行解析器的兩步操作.

【案例1】:

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

【解析】:

1)**預(yù)解析:var function 參數(shù)……**
       a=1
       fn1=function fn1(){
    alert(a);
    var a = 2;
    }
2)**逐行解讀代碼:**
      **表達(dá)式**
      **函數(shù)調(diào)用** (函數(shù)也是一個域,是局部的域杯道,所以調(diào)用后,進(jìn)行預(yù)解析——解讀)
    1>**預(yù)解析:var function 參數(shù)**
        a=…
         2>**逐行解讀代碼**

【案例2】:

<script>
var a=1;
function fn1(){
  alert(a);//1责蝠;自內(nèi)向外党巾,獲取外部的1
  a = 2;
}
fn1();
alert(a);//2:自上而下,因表達(dá)式獲取12行的2霜医,所以這里為2
</script>

★作用域鏈:子級作用域返回到父級去找齿拂,就是作用域鏈。

<script>
var a=1;
function fn1(a){
  alert(a);//undefind:這里是獲取參數(shù)a,調(diào)用時無即未傳參肴敛,則參數(shù)無署海,所以為undefined
  a = 2;
  alert(a);//2 參數(shù)a因?yàn)楸磉_(dá)式賦值為2
}
fn1();
alert(a);//1
</script>

★參數(shù)本質(zhì)上是局部變量吗购;此例子中未傳參則為undefined;

函數(shù)調(diào)用:

再次說明叹侄,出現(xiàn)函數(shù)調(diào)用了巩搏,函數(shù)內(nèi)部即是作用域,需要進(jìn)行預(yù)解析和逐行解讀代碼趾代。

【案例3】:

<script>
var a=1;
function fn1(a){
  alert(a);//1:參數(shù)a也是個變量
  a = 2;
}
fn1(a);
alert(a);//1
</script>

【解析】:


參數(shù)是局部變量贯底,而且參數(shù)還是個表達(dá)式

三、調(diào)用局部數(shù)據(jù)撒强、全局聲明禽捆、for嵌套函數(shù)中i取值

【案例1】

<script>
var sum =0;
function fn1(){
    num++;//作用域鏈的原理,里面獲取外面的
}
fn1();

var sum =0;
function fn2(){
    num--;//作用域鏈的原理飘哨,里面獲取外面的
}
fn2();
fn1();
fn2();

alert(num);//-1
</script>

【案例2】:

<script>
    function fn1(a){
        var a='大雞腿~';
    }
    fn1();
    alert(a);//報錯:Uncaught ReferenceError: a is not defined胚想;因?yàn)橥饷娴牟荒苷业嚼锩娴?</script>

上面兩個例子說明,★函數(shù)只可內(nèi)獲取到外芽隆,外面獲取不到內(nèi)浊服。內(nèi)即是局部,外即是全局胚吁。

四牙躺、那么外部如何獲取函數(shù)內(nèi)的值?

★想要獲取函數(shù)內(nèi)的值:

方法一:通過全局變量腕扶,獲取函數(shù)內(nèi)的內(nèi)容
<script>
var str="";
    function fn1(){
    var a='大雞腿~';
    str=a;
    }
    fn1();
    alert(str);//彈出大雞腿:通過全局變量獲取到了函數(shù)里面的內(nèi)容
</script>
方法二:通過參數(shù)傳統(tǒng)實(shí)現(xiàn)的局部調(diào)用
script>
function fn2(){
    var a="大雞腿";
    fn3(a);
}
fn2();
function fn3(a){
    alert(a);
}
</script>

五孽拷、if(){}和for(){}不是作用域,證明:

<script>
    alert(a);
    function fn1(){
        var a =1;
    }//報錯
</script>

不要把函數(shù)和變量var放在if或者for循環(huán)內(nèi)

<script>
    //alert(a);//undefined
    alert(fn1);//function fn1(){
            //alert(123);
        //}但是有些函數(shù)讀取不出來半抱,所以不要把函數(shù)和變量var放在if或者for循環(huán)內(nèi)
    if(true){
        var a =1;
        function fn1(){
            alert(123);
        }
    }
</script>

六脓恕、其他

<script>
window.onload = function (){
    var aBtn = document.getElementsByTagName('input');
    
    for( var i=0; i<aBtn.length; i++ ){
        aBtn[i].onclick = function (){
            
            alert(i);//3
            
        };
    }
};
</script>

上面的源碼:alert(i);//3

<script>
window.onload = function (){
    var aBtn = document.getElementsByTagName('input');
    
    for( var i=0; i<aBtn.length; i++ ){
        aBtn[i].onclick = function (){  
            alert(i);//undefined
            for( var i=0; i<aBtn.length; i++ ){
                aBtn[i].style.background = 'yellow';
            }
            
        };
    }
};
</script>

上面的源碼:alert(i);//undefined

<script>
window.onload = function (){
    var aBtn = document.getElementsByTagName('input');
    
    for( var i=0; i<aBtn.length; i++ ){
        aBtn[i].onclick = function (){
            alert(i);//3
            for( i=0; i<aBtn.length; i++ ){
                aBtn[i].style.background = 'yellow';
            }
            
        };
    }
};
</script>

上面的源碼alert(i);//3

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市窿侈,隨后出現(xiàn)的幾起案子炼幔,更是在濱河造成了極大的恐慌,老刑警劉巖史简,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件江掩,死亡現(xiàn)場離奇詭異,居然都是意外死亡乘瓤,警方通過查閱死者的電腦和手機(jī)环形,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衙傀,“玉大人抬吟,你說我怎么就攤上這事⊥程В” “怎么了火本?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵危队,是天一觀的道長。 經(jīng)常有香客問我钙畔,道長茫陆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任擎析,我火速辦了婚禮簿盅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘揍魂。我一直安慰自己桨醋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布现斋。 她就那樣靜靜地躺著喜最,像睡著了一般。 火紅的嫁衣襯著肌膚如雪庄蹋。 梳的紋絲不亂的頭發(fā)上瞬内,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音限书,去河邊找鬼虫蝶。 笑死,一個胖子當(dāng)著我的面吹牛蔗包,可吹牛的內(nèi)容都是我干的秉扑。 我是一名探鬼主播慧邮,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼调限,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了误澳?” 一聲冷哼從身側(cè)響起耻矮,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忆谓,沒想到半個月后裆装,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倡缠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年哨免,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昙沦。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡琢唾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盾饮,到底是詐尸還是另有隱情采桃,我是刑警寧澤懒熙,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站普办,受9級特大地震影響工扎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜衔蹲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一肢娘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧踪危,春花似錦蔬浙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蓝仲,卻和暖如春俱病,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袱结。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工亮隙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人垢夹。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓溢吻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親果元。 傳聞我的和親對象是個殘疾皇子促王,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

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

  • 繼承 一、混入式繼承 二而晒、原型繼承 利用原型中的成員可以被和其相關(guān)的對象共享這一特性蝇狼,可以實(shí)現(xiàn)繼承,這種實(shí)現(xiàn)繼承的...
    magic_pill閱讀 1,054評論 0 3
  • 第一章: JS簡介 從當(dāng)初簡單的語言倡怎,變成了現(xiàn)在能夠處理復(fù)雜計(jì)算和交互迅耘,擁有閉包、匿名函數(shù)监署, 甚至元編程等...
    LaBaby_閱讀 1,656評論 0 6
  • 爸媽中秋快樂钠乏,今年女兒又不能陪你們過中秋了栖秕,這已經(jīng)不知道是第幾個念頭沒有陪你們了,可能你們也沒時間想女兒缓熟,...
    一諾安好閱讀 160評論 2 1
  • 假設(shè)一家200個座位的飛機(jī)擊落飛行一次成本是10萬美元累魔,那我們知道每個座位的平均成本就是10萬美元除以2...
    啟夢人閱讀 1,057評論 0 2
  • 【遇見你是一切美好的開始】 初見你摔笤,你是個喜歡笑的女孩。笑起來很甜也很可愛垦写。但是那時候我們并不熟也沒講過話吕世。后來不...
    風(fēng)鈴兒風(fēng)鈴兒閱讀 711評論 0 6