JavaScript作用域深入

咱們首先來回顧一下,咱們?cè)诳蛻舳藶g覽器學(xué)的關(guān)于作用域的東西仔燕,回憶一下造垛,作用域有幾種當(dāng)時(shí)學(xué)的?恩晰搀,對(duì)五辽,有二種,一種叫全局作用域厕隧,一種叫函數(shù)作用域奔脐,也叫局部作用域:

<script>
        var a = 123;//這個(gè)變量a是全局級(jí)別的作用域

        var fn = function(){//函數(shù)fn屬于全局作用域級(jí)下面的函數(shù)
            //這里是屬于局部作用域,下面的a,b變量是屬于當(dāng)前這個(gè)局部作用域的變量
            var a = 234;
            var b = 344;
        }
    </script>

關(guān)于全局作用域的變量或函數(shù)使用原則是:'''代碼從上往下執(zhí)行吁讨,只要在上面的代碼定義過某全局變量或函數(shù)髓迎,那么在任何地方都可以使用這個(gè)全局的變量或函數(shù)'''。

關(guān)于局部作用域的變量或函數(shù)使用原則是:'''當(dāng)前這個(gè)函數(shù)被調(diào)用或叫被使用的時(shí)候建丧,在當(dāng)前局部作用域里定義的變量可以在當(dāng)前作用域被使用排龄,超出這個(gè)作用域范圍之后是訪問不到這個(gè)變量或函數(shù)的'''。

<script>
        var a = 100;
        var fn = function(){
            console.log("fn函數(shù)被調(diào)用");
        }

        var fn1 = function(){
            var b = 123;
            console.log(b);//b是屬于當(dāng)前這個(gè)函數(shù)級(jí)作用域
            console.log(a);//在函數(shù)級(jí)作用域里也可以使用全局變量a
            fn();//在函數(shù)級(jí)作用域里也可以使用全局函數(shù)fn
        }

        fn1();
        console.log(b);//會(huì)報(bào)錯(cuò)翎朱,因?yàn)槲覀冎挥性趂n1函數(shù)級(jí)作用域里定義過變量b
    </script>

另外橄维,不是說在局部作用域里定義的變量或函數(shù)就一定是屬于當(dāng)前這個(gè)作用域,我們還可以通過代理global的全局最大對(duì)象window來在局部作用域里面定義全局變量或函數(shù):

<script>
        var fn = function(){
            window.a = 123;
            window.fn1 = function(){
                console.log("fn1函數(shù)被調(diào)用");
            }
        }

        fn();

        console.log(a);//結(jié)果是123
        fn1();
    </script>

當(dāng)然拴曲,作用域嵌套作用域的情況又會(huì)產(chǎn)生一個(gè)好玩的東西叫閉包:

<script>
        function fn(a){
            var b = 100;
            var fn1 = function(){
                b++;
                console.log(a + b);
            }
            return fn1;
        }

        var myFn = fn(100);
        myFn();
        myFn();
    </script>

到此為止咱們就復(fù)習(xí)完了咱們的客戶端瀏覽器端學(xué)習(xí)的作用域的知識(shí)争舞,現(xiàn)在咱們?cè)倮^續(xù)學(xué)一些其他類型的作用域的知識(shí):

咱們來看一下咱們的node.js,在咱們的node.js里面學(xué)過一個(gè)東西叫模塊澈灼,模塊的思想其實(shí)是來源于生活的竞川,咱們?cè)谄綍r(shí)的情況下有時(shí)候處理一個(gè)東西太復(fù)雜了店溢,不太好研究,咱們會(huì)習(xí)慣性的把這個(gè)事物這個(gè)東西分成一塊一塊的來研究委乌,最常見的就是比如人床牧,咱們就會(huì)把一個(gè)人分為免疫系統(tǒng)、血液系統(tǒng)等各個(gè)系統(tǒng)遭贸,或者像咱們的汽車戈咳,咱們會(huì)把它分成發(fā)動(dòng)機(jī)啊、車胎啊之類的壕吹。在咱們的node.js這個(gè)平臺(tái)里面著蛙,咱們會(huì)把一個(gè)js文件(node文件、json文件)當(dāng)成一個(gè)模塊算利。這時(shí)候就會(huì)出現(xiàn)一種新的作用域叫模塊級(jí)別的作用域册踩。

然后,除了模塊級(jí)作用域之外效拭,在ES3和ES5里面暂吉,咱們想定義一個(gè)變量一般會(huì)采用的是:

var a = 100;

但是這樣定義一個(gè)變量會(huì)有問題的,什么情況下會(huì)出現(xiàn)問題呢缎患?咱們可以看一下面的這段代碼:

"use strict";
if(false){
    var a = 1;
}

console.log(a);

雖然if里的條件表達(dá)式的值是false,但是咱們打印a卻不會(huì)報(bào)錯(cuò)慕的,結(jié)果是undefined,這個(gè)原因在這里也不細(xì)究了(大家可以復(fù)習(xí)一下預(yù)解析相關(guān)的知識(shí)點(diǎn)的內(nèi)容)。

所以挤渔,為了避免這個(gè)問題肮街,在ES6中就有了一個(gè)新的用來定義一個(gè)變量的關(guān)鍵字叫l(wèi)et,比如下面的這段代碼:

"use strict";
if(false){
    let a = 1;
}

console.log(a);

這個(gè)時(shí)候就會(huì)報(bào)錯(cuò)判导,因?yàn)檫@時(shí)候不會(huì)有一個(gè)變量叫a嫉父,因?yàn)椴淮嬖谧兞孔饔糜蛱嵘恕2坏绱搜廴校蹅冊(cè)倏匆欢未a如下:


"use strict";
if(true){
    let a = 1;
}

console.log(a);

這段代碼 也是報(bào)錯(cuò)绕辖,這個(gè)原因就是因?yàn)槿绻昧薼et關(guān)鍵字以后呢,就會(huì)出現(xiàn)一種新的作用域叫塊級(jí)作用域擂红,塊級(jí)作用域只會(huì)存在于當(dāng)前這個(gè)花括號(hào)內(nèi)部仪际。

塊級(jí)作用域和let個(gè)人覺得最有用的應(yīng)該是在好多情況下本來需要閉包,現(xiàn)在不需要了昵骤,可以簡(jiǎn)化代碼:

"use strict";

for(let i=0;i<5;i++){
    setTimeout(function(){
        console.log(i);
    },100);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末树碱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子变秦,更是在濱河造成了極大的恐慌成榜,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹦玫,死亡現(xiàn)場(chǎng)離奇詭異赎婚,居然都是意外死亡雨饺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門惑淳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饺窿,你說我怎么就攤上這事歧焦。” “怎么了肚医?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵绢馍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我肠套,道長(zhǎng)舰涌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任你稚,我火速辦了婚禮瓷耙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘刁赖。我一直安慰自己搁痛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布宇弛。 她就那樣靜靜地躺著鸡典,像睡著了一般。 火紅的嫁衣襯著肌膚如雪枪芒。 梳的紋絲不亂的頭發(fā)上彻况,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音舅踪,去河邊找鬼纽甘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛硫朦,可吹牛的內(nèi)容都是我干的贷腕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咬展,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼泽裳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起破婆,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤涮总,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后祷舀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瀑梗,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烹笔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抛丽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谤职。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖亿鲜,靈堂內(nèi)的尸體忽然破棺而出允蜈,到底是詐尸還是另有隱情,我是刑警寧澤蒿柳,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布饶套,位于F島的核電站,受9級(jí)特大地震影響垒探,放射性物質(zhì)發(fā)生泄漏妓蛮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一圾叼、第九天 我趴在偏房一處隱蔽的房頂上張望蛤克。 院中可真熱鬧,春花似錦褐奥、人聲如沸咖耘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)儿倒。三九已至,卻和暖如春呜笑,著一層夾襖步出監(jiān)牢的瞬間夫否,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工叫胁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凰慈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓驼鹅,卻偏偏與公主長(zhǎng)得像微谓,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子输钩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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