JavaScript基礎(chǔ)之?dāng)U展

js擴(kuò)展

js的作用域

作用域是JavaScript最重要的概念之一痴施,想要學(xué)好JavaScript就需要理解JavaScript作用域和作用域鏈的工作原理。

任何程序設(shè)計(jì)語言都有作用域的概念椭坚,簡單的說,作用域就是變量與函數(shù)的可訪問范圍搏色,即作用域控制著變量與函數(shù)的可見性和生命周期善茎。在JavaScript中,變量的作用域有全局作用域和局部作用域兩種频轿。

1. 全局作用域(Global Scope)

在代碼中任何地方都能訪問到的對象擁有全局作用域垂涯,一般來說一下幾種情形擁有全局作用域:

(1)最外層函數(shù)和在最外層函數(shù)外面定義的變量擁有全局作用域

var name="yuan";

function foo(){
  var age=23;
  function inner(){
    console.log(age);
  }
  inner();
}

console.log(name);    // yuan
//console.log(age);   // Uncaught ReferenceError: age is not defined
foo();                // 23
inner();              // Uncaught ReferenceError: inner is not defined

(2)所有末定義直接賦值的變量自動聲明為擁有全局作用域,例如:

var name="yuan";

function foo(){
    age=23;
    var sex="male"
}
foo();
console.log(age);   //  23
console.log(sex);   // sex is not defined

變量blog擁有全局作用域航邢,而sex在函數(shù)外部無法訪問到耕赘。

(3)所有window對象的屬性擁有全局作用域

一般情況下,window對象的內(nèi)置屬性都都擁有全局作用域翠忠,例如window.alert()鞠苟、window.location、window.top等等秽之。

2. 局部作用域(Local Scope)

和全局作用域相反当娱,局部作用域一般只在固定的代碼片段內(nèi)可訪問到,最常見的例如函數(shù)內(nèi)部考榨,所有在一些地方也會看到有人把這種作用域成為函數(shù)作用域.

如示例1中的age與inner都只有局部作用域跨细。(js中if、for沒有自己的作用域)

作用域鏈(Scope Chain)

在JavaScript中河质,函數(shù)也是對象冀惭,實(shí)際上,JavaScript里一切都是對象掀鹅。函數(shù)對象和其它對象一樣散休,擁有可以通過代碼訪問的屬性和一系列僅供JavaScript引擎訪問的內(nèi)部屬性。其中一個內(nèi)部屬性是[[Scope]]乐尊,由ECMA-262標(biāo)準(zhǔn)第三版定義戚丸,該內(nèi)部屬性包含了函數(shù)被創(chuàng)建的作用域中對象的集合,這個集合被稱為函數(shù)的作用域鏈扔嵌,它決定了哪些數(shù)據(jù)能被函數(shù)訪問限府。

示例演示

//-----**********************例1*********************************

var s=12;
    function f(){
        console.log(s);
         var s=12;          // if s=12
        console.log(s)
    }
    f();

//-----**********************例2*********************************

var s=10;
function foo(){
  console.log(s);
  var s=5;
  console.log(s);
  function s(){console.log("ok")}// 函數(shù)的定于或聲明是在詞法分析時完成的,執(zhí)行時已不再有任何操作

  console.log(s);
}

foo();

//-----***********************例3********************************

function bar(age) {

        console.log(age);
        var age = 99;
        var sex= 'male';
        console.log(age);
        function age() {
            alert(123)
        };
        console.log(age);
        return 100;
}

result=bar(5);

//-----********************************************************

結(jié)果分析

我相信大家一定會有想不到的結(jié)果,接下來我們就以最復(fù)雜的例3來分析整個過程痢缎。

當(dāng)一個函數(shù)創(chuàng)建后胁勺,它的作用域鏈會被創(chuàng)建此函數(shù)的作用域中可訪問的數(shù)據(jù)對象填充。在函數(shù)bar創(chuàng)建時独旷,它的作用域鏈中會填入一個全局對象署穗,該全局對象包含了所有全局變量寥裂,如下圖所示:

img

解析到函數(shù)調(diào)用時,即bar(5)蛇捌,會生成一個active object的對象抚恒,該對象包含了函數(shù)的所有局部變量、命名參數(shù)络拌、參數(shù)集合以及this,然后此對象會被推入作用域鏈的前端回溺,當(dāng)運(yùn)行期上下文被銷毀春贸,活動對象也隨之銷毀。新的作用域鏈如下圖所示:

img

過程解析:

function bar(age) {

        console.log(age);
        var age = 99;
        var sex="male";
        console.log(age);
        function age(){
            alert(123);
        } ;
        console.log(age);
        return 100;
}

result=bar(5);

一 詞法分析過程(涉及參數(shù)遗遵,局部變量聲明萍恕,函數(shù)聲明表達(dá)式):
    1-1 、分析參數(shù)车要,有一個參數(shù)允粤,形成一個 AO.age=undefine;
    1-2 、接收參數(shù) AO.age=5;
    1-3 翼岁、分析變量聲明类垫,有一個 var age, 發(fā)現(xiàn) AO 上面有一個 AO.age ,則不做任何處理
    1-4 琅坡、分析變量聲明悉患,有一個 var sex,形成一個 AO.sex=undefine;
    1-5 榆俺、分析函數(shù)聲明售躁,有一個 function age(){} 聲明, 則把原有的 age 覆蓋成 AO.age=function(){};
二 執(zhí)行過程:
    2-1 茴晋、執(zhí)行第一個 console.log(age) 時陪捷,當(dāng)前的 AO.age 是一個函數(shù),所以輸出的一個函數(shù)
    2-2 诺擅、這句 var age=99; 是對不 AO.age 的屬性賦值市袖, AO.age=99 ,所以在第二個輸出的age是 99;
    2-3 掀虎、同理第三個輸出的是 99, 因?yàn)橹虚g沒有改變 age 值的語句了凌盯。

          注意:執(zhí)行階段:
                        function age(){
                            alert(123)
                        };

            不進(jìn)行任何操作,將執(zhí)行語句復(fù)制給age這部操作是在詞法分析時烹玉,即運(yùn)行前完成的驰怎。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市二打,隨后出現(xiàn)的幾起案子县忌,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件症杏,死亡現(xiàn)場離奇詭異装获,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)厉颤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門穴豫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逼友,你說我怎么就攤上這事精肃。” “怎么了帜乞?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵司抱,是天一觀的道長。 經(jīng)常有香客問我黎烈,道長习柠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任照棋,我火速辦了婚禮资溃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘必怜。我一直安慰自己肉拓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布梳庆。 她就那樣靜靜地躺著暖途,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膏执。 梳的紋絲不亂的頭發(fā)上驻售,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音更米,去河邊找鬼欺栗。 笑死,一個胖子當(dāng)著我的面吹牛征峦,可吹牛的內(nèi)容都是我干的迟几。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼栏笆,長吁一口氣:“原來是場噩夢啊……” “哼类腮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蛉加,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蚜枢,失蹤者是張志新(化名)和其女友劉穎缸逃,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厂抽,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡需频,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了筷凤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昭殉。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嵌施,靈堂內(nèi)的尸體忽然破棺而出饲化,到底是詐尸還是另有隱情,我是刑警寧澤吗伤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站硫眨,受9級特大地震影響足淆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜礁阁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一巧号、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧姥闭,春花似錦丹鸿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至铜跑,卻和暖如春门怪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锅纺。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工掷空, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人囤锉。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓坦弟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親官地。 傳聞我的和親對象是個殘疾皇子酿傍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

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