05.作用域

一.作用域

1. 函數(shù)能封閉住定義域

一個變量如果定義在了一個function里面烈掠,那么這個變量就是一個局部變量煮仇,只在這個function里面有定義,出了這個function,就如同沒有定義過一樣

function fn(){
    var a = 3;//定義在函數(shù)里的變量,那么這個變量 就是局部變量碟婆,只有在函數(shù)里面有定義
console.log("我是函數(shù)里面的語句电抚,所以我知道a值是'' + a ");
}
fn();
console.log("我是函數(shù)外面的語句惕稻,我認為a的值是'' + a");  //undefined
expng.png

a被var在了function里面,所以現(xiàn)在這個a變量只在函數(shù)內定義

JavaScript變量作用域非常的簡單蝙叛,沒有塊級作用域俺祠,管理住作用域的只有一個東西,函數(shù)

如果一個變量借帘,沒有定義在任何的function中蜘渣,那么它將在全部程序范圍內都有定義:就是你在JS的任何位置都能夠使用它。

var a = 10;//定義在全局范圍內的一個變量肺然,全局變量蔫缸,在程序任何一個區(qū)域都有定義
function fn(){
      console.log("我是函數(shù)里面的語句,我認識全局變量a 际起,它的值為'' + a");
}
fn();
console.log("函數(shù)外面的語句拾碌,我也認識a,它的值為'' +  a");
quan.png

總結:

  • 定義在function里面的變量街望,叫做局部變量校翔,只在function里面有定義,出了function沒有定義的
  • 定義在全局范圍的 灾前,沒寫在任何function里面的防症,叫做全局變量,全局都認識

2.作用域鏈

當遇見一個變量時,JS引擎會從其所在的作用域依此向外層 查找蔫敲,查找會在找到第一個匹配的標識符的時候停止

function outer(){
    var a = 3;      //a的作用域就是outer
    function inner(){
        var b = 5;      //b的作用域就是inner
        console.log(a); //能夠正常輸出3饲嗽,a在本層沒有定義,就是找上層
        console.log(b);   //能夠正常輸出5
    }
    inner();
}

outer();
console.log(a);     //報錯奈嘿,因為a的作用域outer

多層嵌套喝噪,如果有同名的變量,那么就會發(fā)生”遮蔽效應“

var a =2;//全局變量
function fn(){
  var a = 3;//就把外層的a給遮蔽了指么,這個函數(shù)內部看不見外層的a了酝惧,
  console.log(a);//輸出3,變量在當前作用域尋找伯诬,找到a的定義為3
}
fn();
console.log(a);//輸出為2晚唇, 變量在當前作用域尋找,找到a的定義值為2

作用域鏈:一個變量在使用的時候盗似,就會在當前層尋找它是否被定義哩陕,如果找不到,就去找上一層function赫舒,知道找到全局變量悍及,如果全局頁面沒有,就報錯接癌。

var a = 1;//全局變量
var b = 2; //全局變量
function outer(){
    var a = 3; //遮蔽了外層a心赶,a局部變量
     function inner(){
      var b = 4;//遮蔽了外層的b,b局部變量
      console.log(a);//① 輸出3缺猛,a現(xiàn)在在當前層找不到定義缨叫,所以就上一層尋找
      console.log(b); //②  輸出4
      }
      inner();  //調用函數(shù)
      console.log(a);  //③ 輸出3
      console.log(b);  //④ 輸出2 b現(xiàn)在在當前層找不到定義就上一層尋找
}
outer();  //執(zhí)行函數(shù),控制權交給了outer
console.log(a); //⑤ 輸出1
console.log(b); //⑥ 輸出2

3. 不寫var就自動成全局變量

// var a, 相當于在全局var了一個a
    function fn(){
    a  =  3; //這個a第一次賦值的時候荔燎,并沒有var過
                // 所以就自動的在全局的范圍幫你var了一次
}
fn();
console.log(a);

這是JS的一個機理耻姥,如果遇見了一個標識符,從來沒有var過有咨,并且還賦值了:

 num = 12;

那么就會自動幫你在全局范圍內定義 var num琐簇;

4. 函數(shù)的參數(shù),會默認定義為這個函數(shù)的局部變量

function fn(a,b,c,d){
          // var a, b, c, d; 相當于在函數(shù)內部var四個變量座享,是局部變量
}

a, b, c, d就是一個fn的局部變量婉商,出了fn就沒有定義

5. 全局變量的作用

5.1 通信,共同操作一個變量

兩個函數(shù)同時操作同一個變量征讲,一個增加据某,一個減少,函數(shù)和函數(shù)通信

var  num = 0;
function add(){
    num++;
  }
function remove(){
    num--诗箍;
}
5.2 累加癣籽,重復調用函數(shù)的時候挽唉,不會重置
var num = 0;
function baoshu(){
    num++;
    console.log(num);
}
baoshu(); //1
baoshu();//2
baoshu();//3

如果num定義在baoshu里面,每次執(zhí)行就會把num重置為0筷狼,

function baoshu(){
    var num = 0;
    num++;
    console.log(num);
}
baoshu(); //1
baoshu();//1
baoshu();//1

6.函數(shù)的定義也有作用域

//這個函數(shù)返回a的平方加b的平方
function pingfanghe(a,b){
    return  pingfang(a) + pingfang(b);
    //返回m的平方
    function pingfang(m){
        return Math.pow(m,2)
    }
}

// 現(xiàn)在相求4的平方瓶籽,想輸出16
pingfang(4);    //報錯,因為全局作用域下埂材,沒有一個函數(shù)叫做pingfang

機理:

function big{
    function small{
    
      }
    small();//可以運行
}
small(); //不能運行塑顺,因為小small函數(shù)定義在了big函數(shù)里面,離開big函數(shù)沒有作用域

二.閉包

1. 閉包

function outer(){
    var a =33;
    function inner(){
        console.log(a);
      }
      return inner;
}
var inn = outer();
inn();  //彈出33

推導過程:
inner()這個函數(shù)不能在outer外面調用俏险,因為outer外面沒有inne的定義

function outer(){
      var a = 88;
      function inner(){
        console.log(a);
    }
}
//在全局調用inner 但是全局沒有inner定義严拒,所以會報錯
inner();

但是我們現(xiàn)在就想在全局作用域下,運行outer內部的inner,此時我們必須想一些奇奇怪怪的方法竖独。

有一個簡單可行的辦法裤唠,就是讓outer自己return掉inner:

function outer(){
      var a = 3; 
      function inner(){
          console.log(a);
      }
      return inner;//outer返回了inner的引用
}

var inn = outer(): //inn就是inner函數(shù)了
inn(); //執(zhí)行inn,全局作用下沒有a的定義
//但是函數(shù)閉包莹痢,能夠把定義函數(shù)的時候的作用域的時候一起記憶住
//能夠輸出33

這就說明了种蘸,inner函數(shù)能夠持久保存自己定義是的所處環(huán)境,并且及時自己在其他的環(huán)境被調用的時候竞膳,依然可以訪問自己定義時所處環(huán)境的值

一個函數(shù)可以把它自己內部的語句航瞭,和自己聲明時所處的作用域一起封裝乘了一個密閉的環(huán)境,我們稱之為“閉包”(Closures)

每一個函數(shù)都是閉包坦辟,每個函數(shù)天生就能記憶自己定義時所處的作用域環(huán)境刊侯。但是,我們必須將這個函數(shù)挪到別的作用域长窄,才能更好的觀察閉包滔吠。這樣才能實驗它有沒有把作用域給“記住”

2. 閉包的性質

每次重新引用函數(shù)的時候,閉包時全新的挠日。

function outer(){
    var count = 0;
    function inner(){
        count++;
        console.log(count);
    }
  return inner;
}
var inn1 = outer();
var inn2 = outer();
inn1();//1
inn1();//1
inn1();//1
inn1();//1
inn2();//1
inn2();//2
inn1();//1

無論它在何處被調用,它總是能訪問它定義時所處作用域中的全部變量

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末翰舌,一起剝皮案震驚了整個濱河市嚣潜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌椅贱,老刑警劉巖懂算,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異庇麦,居然都是意外死亡计技,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門山橄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垮媒,“玉大人,你說我怎么就攤上這事∷停” “怎么了萌衬?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長它抱。 經(jīng)常有香客問我秕豫,道長,這世上最難降的妖魔是什么观蓄? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任混移,我火速辦了婚禮,結果婚禮上侮穿,老公的妹妹穿的比我還像新娘沫屡。我一直安慰自己,他們只是感情好撮珠,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布沮脖。 她就那樣靜靜地躺著,像睡著了一般芯急。 火紅的嫁衣襯著肌膚如雪勺届。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天娶耍,我揣著相機與錄音免姿,去河邊找鬼。 笑死榕酒,一個胖子當著我的面吹牛胚膊,可吹牛的內容都是我干的。 我是一名探鬼主播想鹰,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼紊婉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辑舷?” 一聲冷哼從身側響起喻犁,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎何缓,沒想到半個月后肢础,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡碌廓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年传轰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谷婆。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡慨蛙,死狀恐怖辽聊,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情股淡,我是刑警寧澤身隐,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站唯灵,受9級特大地震影響贾铝,放射性物質發(fā)生泄漏。R本人自食惡果不足惜埠帕,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一垢揩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧敛瓷,春花似錦叁巨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至狡蝶,卻和暖如春庶橱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贪惹。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工苏章, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奏瞬。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓枫绅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親硼端。 傳聞我的和親對象是個殘疾皇子并淋,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354