国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS基礎(chǔ)-閉包

Scliang / 3270人閱讀

摘要:如果不用的話,你實(shí)際上聲明了一個(gè)全局變量閉包有權(quán)訪問另一個(gè)函數(shù)作用域的變量,常見的創(chuàng)建方式就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù),通過另一個(gè)函數(shù)訪問這個(gè)函數(shù)的局部變量。

變量作用域

變量的作用域無非就是兩種:全局變量和局部變量。

函數(shù)內(nèi)部聲明變量的時(shí)候,一定要使用var命令。如果不用的話,你實(shí)際上聲明了一個(gè)全局變量!

閉包

有權(quán)訪問另一個(gè)函數(shù)作用域的變量,常見的創(chuàng)建方式就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù),通過另一個(gè)函數(shù)訪問這個(gè)函數(shù)的局部變量。

簡單的說就是,閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)

由于在Javascript語言中,只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量,因此可以把閉包簡單理解成"定義在一個(gè)函數(shù)內(nèi)部的函數(shù)"。

MDN中定義的是:

閉包是指能夠訪問自由變量的函數(shù)。換句話說,在閉包中定義的函數(shù)可以“記憶”它被創(chuàng)建的環(huán)境。

注:自由變量是既不是在本地聲明又不作為參數(shù)傳遞的一類變量。

簡單的例子

function A(){
    function B(){
        console.log("Hello Closure!");
    }
    return B;
}

var b = A();
b();//Hello Closure!

所以通過這個(gè)例子可以簡單理解閉包。

* 定義一個(gè)函數(shù)A()
* A中定義了函數(shù)B()
* A中返回B
* 執(zhí)行A(),把A的返回結(jié)果賦值給變量b
* 執(zhí)行b()   

總結(jié)一句話:函數(shù)A的內(nèi)部函數(shù)B被函數(shù)A外的一個(gè)變量b引用。所以當(dāng)一個(gè)內(nèi)部函數(shù)被其外部函數(shù)之外的變量引用時(shí),就形成了一個(gè)閉包

閉包的作用

在一個(gè)模塊中定義一個(gè)變量,希望這個(gè)變量保存在內(nèi)存中又不會(huì)污染全局變量,就用閉包來定義這個(gè)模板。

它的最大用處有兩個(gè),一個(gè)是前面提到的可以讀取函數(shù)內(nèi)部的變量,另一個(gè)就是讓這些變量的值始終保持在內(nèi)存中。

閉包的注意點(diǎn)

閉包優(yōu)點(diǎn),也是缺點(diǎn),局部變量駐留在內(nèi)存中,可以回避使用全局變量,但由于閉包里的資源不會(huì)被立刻銷毀回收,所以可能占用更多的內(nèi)存,過度使用閉包會(huì)導(dǎo)致性能下降。

閉包會(huì)在父函數(shù)外部,改變父函數(shù)內(nèi)部變量的值。所以,如果你把父函數(shù)當(dāng)作對象(object)使用,把閉包當(dāng)作它的公用方法(Public Method),把內(nèi)部變量當(dāng)作它的私有屬性(private value),這時(shí)一定要小心,不要隨便改變父函數(shù)內(nèi)部變量的值。

注意:可以使用之后,給它加null,接觸引用。

舉例

例子1:

var name = "The Window"; // 全局
var object = {    
    name: "My Object", // 局部
    getNameFunc: function () { // 對象中的方法,this指向obj這個(gè)對象      
        return function () { // 閉包       
            return this.name; // this指向window    
        };     
    } 
};
     
alert(object.getNameFunc()()); // The Window

例子2:

var name = "The Window"; // 全局
var object = {    
    name: "My Object", // 局部
    getNameFunc: function () { // 對象中的方法,this指向obj這個(gè)對象 
        var that = this; // 將getNameFunc()的this保存在that變量中      
        return function () { // 閉包   
            return that.name; // that指向object    
        };     
    } 
};
     
alert(object.getNameFunc()()); // My Object

例子3:

var name = "The Window"; // 全局
var object = {    
    name: "My Object", // 局部
    getNameFunc: function () {   
        return function () { // 閉包   
            var that = this;  
            return that.name;     
        };     
    } 
};
     
alert(object.getNameFunc()()); // The Window

例子4:

var name = "The Window"; // 全局
var object = {    
    name: "My Object", // 局部
    getNameFunc: function () { // 對象中的方法,this指向obj這個(gè)對象      
        return function () { // 閉包   
            var that = this; // 將getNameFunc()的this保存在that變量中 
            return that.name; // this指向window    
        };     
    } 
};
     
alert(object.getNameFunc().call(object)); // My Object call改變this指向

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/94718.html

相關(guān)文章

  • JS函數(shù)的一些基礎(chǔ)知識(shí)

    摘要:為了更好的講解構(gòu)造函數(shù)原型原型鏈等,我們需要復(fù)習(xí)一下函數(shù)的一些基礎(chǔ)知識(shí)。閉包在復(fù)習(xí)了函數(shù)的相關(guān)基礎(chǔ)知識(shí)之后,我們終于可以進(jìn)入閉包。我們可以這樣理解閉包,首先,閉包是一個(gè)函數(shù),是一個(gè)什么樣子的函數(shù)呢是一個(gè)可以訪問另一個(gè)函數(shù)中變量的函數(shù)。 為了更好的講解構(gòu)造函數(shù)、原型、原型鏈等,我們需要復(fù)習(xí)一下函數(shù)的一些基礎(chǔ)知識(shí)。接下來,就讓我們一起回味一些JS的基礎(chǔ)知識(shí)點(diǎn)。 全局變量VS局部變量 簡單粗...

    Ashin 評論0 收藏0
  • JS基礎(chǔ)知識(shí):變量對象、作用域鏈和閉包

    摘要:前言這段時(shí)間一直在消化作用域鏈和閉包的相關(guān)知識(shí)。而作用域鏈則是這套規(guī)則這套規(guī)則的具體運(yùn)行。是變量對象的縮寫那這樣放有什么好處呢我們知道作用域鏈保證了當(dāng)前執(zhí)行環(huán)境對符合訪問權(quán)限的變量和函數(shù)的有序訪問。 前言:這段時(shí)間一直在消化作用域鏈和閉包的相關(guān)知識(shí)。之前看《JS高程》和一些技術(shù)博客,對于這些概念的論述多多少少不太清楚或者不太完整,包括一些大神的技術(shù)文章。這也給我的學(xué)習(xí)上造成了一些困惑,...

    Keven 評論0 收藏0
  • Js基礎(chǔ)知識(shí)(三) - 作用域與閉包

    摘要:是詞法作用域工作模式。使用可以將變量綁定在所在的任意作用域中通常是內(nèi)部,也就是說為其聲明的變量隱式的劫持了所在的塊級作用域。 作用域與閉包 如何用js創(chuàng)建10個(gè)button標(biāo)簽,點(diǎn)擊每個(gè)按鈕時(shí)打印按鈕對應(yīng)的序號? 看到上述問題,如果你能看出來這個(gè)問題實(shí)質(zhì)上是考對作用域的理解,那么恭喜你,這篇文章你可以不用看了,說明你對作用域已經(jīng)理解的很透徹了,但是如果你看不出來這是一道考作用域的題目,...

    lemanli 評論0 收藏0
  • Js基礎(chǔ)知識(shí)(三) - 作用域與閉包

    摘要:是詞法作用域工作模式。使用可以將變量綁定在所在的任意作用域中通常是內(nèi)部,也就是說為其聲明的變量隱式的劫持了所在的塊級作用域。 作用域與閉包 如何用js創(chuàng)建10個(gè)button標(biāo)簽,點(diǎn)擊每個(gè)按鈕時(shí)打印按鈕對應(yīng)的序號? 看到上述問題,如果你能看出來這個(gè)問題實(shí)質(zhì)上是考對作用域的理解,那么恭喜你,這篇文章你可以不用看了,說明你對作用域已經(jīng)理解的很透徹了,但是如果你看不出來這是一道考作用域的題目,...

    XFLY 評論0 收藏0

發(fā)表評論

0條評論

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