理解JS中的作用域

作用域是一個基礎但又很重要的概念酵使,對于初學者來說,深入了解作用域是前端進階的基礎。

1. 什么是作用域

簡單的來說吭练,作用域就是程序源代碼中定義變量的區(qū)域,也是你代碼當前的上下文環(huán)境析显,更好的解釋就時內(nèi)存中開辟出來的一段空間鲫咽,JavaScript采用詞法作用域,同時也被稱作靜態(tài)作用域谷异。

靜態(tài)作用域分尸、動態(tài)作用域:

var a= 1;

function fun1() {

    console.log(a);
}

function fun2() {

    var a= 2;

    fun1();
}

fun1();   // 1

由于JavaScript采用的是靜態(tài)作用域,所以他的執(zhí)行過程如下:

執(zhí)行 fun1函數(shù)歹嘹,在從 fun1函數(shù)內(nèi)部查找是否有局部變量 a箩绍。如果沒有,查找上面一層的代碼尺上,也就是 a等于 1材蛛,所以最終結(jié)果為 1。

那么JavaScript采用的是動態(tài)作用域呢怎抛,他的執(zhí)行是怎么的卑吭?

執(zhí)行 fun1函數(shù),從 fun1函數(shù)內(nèi)部查找是否有局部變量 a马绝。如果沒有豆赏,就從調(diào)用fun1的函數(shù)中查找是否有a,即fun2 函數(shù)中找a 變量迹淌,這樣執(zhí)行的結(jié)果為2河绽。

2. 作用域之間的差異

function a() {

    function b() {   

       c = 1; 
   }
}

提出問題,c的作用域應該是唉窃?b的耙饰?a的?哦纹份,原來是全局的苟跪,因為前面沒有加var廷痘。

局部作用域:

一般只在固定的代碼片段內(nèi)可訪問到,如函數(shù)內(nèi)部

直接上代碼:

function fun1() {

      var a = 1;

      console.log(a);
}

fun1();   //   1



function fun2() {

      var b = 2;    //   b只能在函數(shù)內(nèi)部使用
}

fun2();

console.log(b);   //   報錯:b b is not defined

全局作用域:

var c = 3;

function fun3() {

     console.log(c);
}

fun3();   //   3


function fun4() {

      d = 4;    //   
}

fun4();

      console.log(d);   //   4

從上面兩個例子中可以看到:函數(shù)內(nèi)部可以訪問外部變量件已,函數(shù)外部不能訪問函數(shù)內(nèi)部變量笋额。
此處還應該注意:
如果是在過程外部,用var和不用var定義的變量都是全局變量篷扩,但是在過程內(nèi)部兄猩,用了var定義的變量是局部變量,沒有用var定義的變量就是全局變量鉴未。

3. ES6中新增的let作用域

在ES6未出現(xiàn)之前沒有塊級作用域的概念枢冤,這就會導致在一些情況下,局部變量常常會污染全局變铜秆,舉個例子:

var a = 1;

function fun1() {

      var a = 2;

      console.log(a);
}

fun1();   //   2    局部變量即fun1中的變量a淹真,替換了全局變量中的a,污染了全局變量连茧。

ES6中的塊級作用域核蘸,在{}睡蟋、for蒿柳、if中都可以聲明。

ES6有幾個特點:

1茂装、let是塊級變量坯汤,不存在于window下虐唠,window.變量名是找不到的
2、 在沒有聲明的情況下使用會拋出異常
3惰聂、也不允許重復聲明變量疆偿,即變量名唯一

let a = 1;

window.a;   //   undefined



function fun1(){

        console.log(b);

        let b =2;
    }

    fun1();  //   報錯    fun1 is not defined



function fun2() {

     let c =2;

     var c = 3;

     console.log(c);
}

fun2();   //   報錯    Identifier 'b' has already been declared

let在for循環(huán)中的使用:
(先看一下var)

for(var i=0; i<2; i++){

    console.log('outer i: ' + i);

    for(var i=0; i<2; i++){

    console.log('inner i: '+i);   //   外層循環(huán)被打斷了,因為i為全局變量所以 i 的值被內(nèi)層循環(huán)修改了

    }
}

結(jié)果是:

outer i: 0
inner i: 0
inner i: 1

把var換成let:

for(var i=0; i<2; i++){

    console.log('outer i: ' + i);

    for(let i=0; i<2; i++){

    console.log('inner i: '+i);   //   每一次循環(huán)都重新綁定一次作用域

    }
}

結(jié)果是:

outer i: 0
outer i: 0
inner i: 0
inner i: 1
outer i: 1
inner i: 0
inner i: 1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搓幌,一起剝皮案震驚了整個濱河市杆故,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌溉愁,老刑警劉巖处铛,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拐揭,居然都是意外死亡撤蟆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門堂污,熙熙樓的掌柜王于貴愁眉苦臉地迎上來家肯,“玉大人,你說我怎么就攤上這事盟猖√忠拢” “怎么了换棚?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長反镇。 經(jīng)常有香客問我固蚤,道長,這世上最難降的妖魔是什么歹茶? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任夕玩,我火速辦了婚禮,結(jié)果婚禮上辆亏,老公的妹妹穿的比我還像新娘风秤。我一直安慰自己鳖目,他們只是感情好扮叨,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著领迈,像睡著了一般彻磁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狸捅,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天衷蜓,我揣著相機與錄音,去河邊找鬼尘喝。 笑死磁浇,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的朽褪。 我是一名探鬼主播置吓,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缔赠!你這毒婦竟也來了衍锚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤嗤堰,失蹤者是張志新(化名)和其女友劉穎戴质,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踢匣,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡告匠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了离唬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片后专。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖男娄,靈堂內(nèi)的尸體忽然破棺而出行贪,到底是詐尸還是另有隱情漾稀,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布建瘫,位于F島的核電站崭捍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏啰脚。R本人自食惡果不足惜殷蛇,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望橄浓。 院中可真熱鬧粒梦,春花似錦、人聲如沸荸实。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽准给。三九已至泄朴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間露氮,已是汗流浹背祖灰。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留畔规,地道東北人局扶。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像叁扫,于是被迫代替她去往敵國和親三妈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

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