成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

[JS]《你不知道的Javascript·上》——詞法作用域和閉包

guqiu / 2325人閱讀

摘要:吐槽一下,閉包這個(gè)詞的翻譯真是有很大的誤解性啊要說(shuō)閉包,要先說(shuō)下詞法作用域。閉包兩個(gè)作用通過(guò)閉包,在外部環(huán)境訪(fǎng)問(wèn)內(nèi)部環(huán)境的變量。閉包使得函數(shù)可以繼續(xù)訪(fǎng)問(wèn)定義時(shí)的詞法作用域。

閉包是真的讓人頭暈啊,看了很久還是覺(jué)得很模糊。只能把目前自己的一些理解先寫(xiě)下來(lái),這其中必定包含著一些錯(cuò)誤,待日后有更深刻的理解時(shí)再作更改。

吐槽一下,閉包這個(gè)詞的翻譯真是有很大的誤解性啊……

要說(shuō)閉包,要先說(shuō)下詞法作用域。

詞法作用域
簡(jiǎn)單來(lái)說(shuō),詞法作用域就是定義在詞法階段的作用域。換句話(huà)說(shuō),詞法作用域是由你在寫(xiě)代碼時(shí)將變量和塊作用域?qū)懺谀睦飦?lái)決定的。

無(wú)論函數(shù)在哪里被調(diào)用,也無(wú)論它如何被調(diào)用,它的詞法作用域都只由函數(shù)被聲明時(shí)所處的位置決定。

閉包 關(guān)于閉包
閉包的各個(gè)理解:
當(dāng)函數(shù)可以記住并訪(fǎng)問(wèn)所在的詞法作用域,即使函數(shù)是在當(dāng)前詞法作用域之外執(zhí)行,這時(shí)就產(chǎn)生了閉包。
作者:Cat Chen
閉包就是由函數(shù)創(chuàng)造的一個(gè)詞法作用域,里面創(chuàng)建的變量被引用后,可以在這個(gè)詞法環(huán)境之外自由使用。
閉包通常用來(lái)創(chuàng)建內(nèi)部變量,使得這些變量不能被外部隨意修改,同時(shí)又可以通過(guò)指定的函數(shù)接口來(lái)操作。
function foo(){
    var a=2;
    function bar(){
        console.log(a);
    }
    return bar;
}
var baz=foo();
baz();//2——閉包

兩個(gè)作用:
(1):通過(guò)閉包,在外部環(huán)境訪(fǎng)問(wèn)內(nèi)部環(huán)境的變量。
(2):使得這些變量一直保存在內(nèi)存中,不會(huì)被垃圾回收。

上面的代碼例子中,函數(shù)在定義時(shí)的詞法作用域以外的地方被調(diào)用。閉包使得函數(shù)可以繼續(xù)訪(fǎng)問(wèn)定義時(shí)的詞法作用域。//?

調(diào)用的方式不僅僅只有以上代碼中的通過(guò)不同的標(biāo)識(shí)符引用調(diào)用其內(nèi)部的函數(shù),

但是不管通過(guò)什么手段將內(nèi)部函數(shù)傳遞到所在的詞法作用域以外,它都會(huì)持有對(duì)原始定義作用域的引用,無(wú)論在何處執(zhí)行這個(gè)函數(shù)都會(huì)使用閉包。
循環(huán)和閉包
for (var i=1;i<=5;i++){
    setTimeout(function timer(){
        console.log(i);
    },i*1000);
}

正常預(yù)想下,上面這段代碼我們以為是分別輸出數(shù)字1-5,每秒一個(gè)。
但實(shí)際上,運(yùn)行時(shí)輸出的卻是每秒輸出一個(gè)6,一共五次。

原因是,延遲函數(shù)的回調(diào)會(huì)在循環(huán)結(jié)束時(shí)才執(zhí)行。
根據(jù)作用域的工作原理,循環(huán)中的五個(gè)函數(shù)是在各個(gè)迭代中分別定義的,但是它們都被封閉在一個(gè)共享的全局作用域中,實(shí)際上只有一個(gè)i。

我們可以通過(guò)IIFE創(chuàng)建作用域。(IIFE會(huì)通過(guò)聲明并立即執(zhí)行一個(gè)函數(shù)來(lái)創(chuàng)建作用域)。

for (var i=1;i<=5;i++){
    (funtion(){
        setTimeout(function timer(){
            console.log(i);
        },i*1000);
    })();
}

但是這樣創(chuàng)建的作用域里是空的,需要有自己的變量:

for (var i=1;i<=5;i++){
    (funtion(){
        var j=i;
        setTimeout(function timer(){
            console.log(j);
        },j*1000);
    })();
}

改進(jìn)得到:

for (var i=1;i<=5;i++){
    (funtion(j){
        setTimeout(function timer(){
            console.log(j);
        },j*1000);
    })(i);
}

ES6引入的let在循環(huán)中不止會(huì)被聲明一次,在每次迭代都會(huì)聲明:

for (let i=1;i<=5;i++){
    setTimeout(function timer(){
        console.log(i);
    },i*1000);
}
應(yīng)用場(chǎng)景:模塊

模塊也是利用了閉包的一個(gè)強(qiáng)大的代碼模式。

function CoolModule(){
    var something="cool";
    var anothor=[1,2,3];
    
    function doSomething(){
        console.log(something);
    }
    
    function doAnthor(){
        console.log(anothor.join("!"));
    }
    
    return{
        doSomethig:doSomething,
        doAnothor:doAnother
    };
}

var foo=CoolMOdule();
foo.doSomething();//cool
foo.doAnother();//1!2!3
模塊有2個(gè)主要特征:
(1):為創(chuàng)建內(nèi)部作用域而調(diào)用了一個(gè)包裝函數(shù);
(2):包裝函數(shù)的返回值必須至少包括一個(gè)對(duì)內(nèi)部函數(shù)的引用,這樣就會(huì)創(chuàng)建涵蓋整個(gè)包裝函數(shù)內(nèi)部作用域的閉包。
關(guān)于模塊的引入
import可以將一個(gè)模塊中的一個(gè)或多個(gè)API導(dǎo)入到當(dāng)前作用域中,并分別綁定在一個(gè)變量上;
module會(huì)將整個(gè)模塊的API導(dǎo)入并綁定到一個(gè)變量上;
export會(huì)將當(dāng)前模塊的一個(gè)標(biāo)識(shí)符導(dǎo)出為公共API。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95871.html

相關(guān)文章

  • 你應(yīng)該要知道作用域和閉包

    摘要:寫(xiě)在前面對(duì)于一個(gè)前端開(kāi)發(fā)者,應(yīng)該沒(méi)有不知道作用域的。欺騙詞法作用域有兩個(gè)機(jī)制可以欺騙詞法作用域和。關(guān)于你不知道的的第一部分作用域和閉包已經(jīng)結(jié)束了,但是,更新不會(huì)就此止住未完待續(xù) 這是《你不知道的JavaScript》的第一部分。 本系列持續(xù)更新中,Github 地址請(qǐng)查閱這里。 寫(xiě)在前面 對(duì)于一個(gè)前端開(kāi)發(fā)者,應(yīng)該沒(méi)有不知道作用域的。它是一個(gè)既簡(jiǎn)單有復(fù)雜的概念,簡(jiǎn)單到每行代碼都有它的影子...

    JouyPub 評(píng)論0 收藏0
  • 重讀你不知道JS () 第一節(jié)五章

    摘要:詞法作用域的查找規(guī)則是閉包的一部分。因此的確同閉包息息相關(guān),即使本身并不會(huì)真的使用閉包。而上面的創(chuàng)建一個(gè)閉包,本質(zhì)上這是將一個(gè)塊轉(zhuǎn)換成一個(gè)可以被關(guān)閉的作用域。結(jié)合塊級(jí)作用域與閉包模塊這個(gè)模式在中被稱(chēng)為模塊。 你不知道的JS(上卷)筆記 你不知道的 JavaScript JavaScript 既是一門(mén)充滿(mǎn)吸引力、簡(jiǎn)單易用的語(yǔ)言,又是一門(mén)具有許多復(fù)雜微妙技術(shù)的語(yǔ)言,即使是經(jīng)驗(yàn)豐富的 Jav...

    worldligang 評(píng)論0 收藏0
  • 你不知道 JavaScript 筆記——作用域和閉包

    摘要:理解作用域在引擎看來(lái)是兩個(gè)完全不同的聲明。在循環(huán)中使用閉包閉包是函數(shù)和聲明該函數(shù)的詞法環(huán)境的組合。回到我們上面說(shuō)的在自己定義的作用域以外的地方執(zhí)行,這里聲明的是全局變量,使用全局變量不構(gòu)成閉包。 第一章:作用域是什么 程序中變量存儲(chǔ)在哪里,需要是怎么找到它,這就需要設(shè)計(jì)一套存儲(chǔ)以及能方便的找到它的規(guī)則,這個(gè)規(guī)則就是作用域 編譯原理 JavaScript 是一門(mén)編譯語(yǔ)言,它與傳統(tǒng)編譯語(yǔ)言...

    BearyChat 評(píng)論0 收藏0
  • 重讀你不知道JS () 第一節(jié)二章

    摘要:詞法作用域定義在詞法階段的作用域由你在寫(xiě)代碼時(shí)將變量和塊作用域?qū)懺谀膩?lái)決定的,因此當(dāng)詞法分析器處理代碼時(shí)會(huì)保持作用域不變。欺騙詞法作用域在詞法分析器處理過(guò)后依然可以修改作用域。 你不知道的JS(上卷)筆記 你不知道的 JavaScript JavaScript 既是一門(mén)充滿(mǎn)吸引力、簡(jiǎn)單易用的語(yǔ)言,又是一門(mén)具有許多復(fù)雜微妙技術(shù)的語(yǔ)言,即使是經(jīng)驗(yàn)豐富的 JavaScript 開(kāi)發(fā)者,如果沒(méi)...

    baihe 評(píng)論0 收藏0
  • 十分鐘快速了解《你不知道 JavaScript》(卷)

    摘要:最近剛剛看完了你不知道的上卷,對(duì)有了更進(jìn)一步的了解。你不知道的上卷由兩部分組成,第一部分是作用域和閉包,第二部分是和對(duì)象原型。附錄詞法這一章并沒(méi)有說(shuō)明機(jī)制,只是介紹了中的箭頭函數(shù)引入的行為詞法。第章混合對(duì)象類(lèi)類(lèi)理論類(lèi)的機(jī)制類(lèi)的繼承混入。 最近剛剛看完了《你不知道的 JavaScript》上卷,對(duì) JavaScript 有了更進(jìn)一步的了解。 《你不知道的 JavaScript》上卷由兩部...

    趙春朋 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

guqiu

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<