国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

詳解JavaScript閉包問(wèn)題

發(fā)布時(shí)間:2021-08-17 12:16 來(lái)源: 閱讀:0 作者:qq_46186155 欄目: JavaScript 歡迎投稿:712375056

閉包是純函數式編程語(yǔ)言的傳統特性之一。通過(guò)將閉包視為核心語(yǔ)言構件的組成部分,JavaScript語(yǔ)言展示了其與函數式編程語(yǔ)言的緊密聯(lián)系。由于能夠簡(jiǎn)化復雜的操作,閉包在主流JavaScript庫以及高水平產(chǎn)品代碼中日益流行起來(lái)。

一、變量的作用域

在介紹閉包之前,我們先理解JavaScript的變量作用域。變量的作用域分為兩種:全局變量和局部變量。

1、全局變量

var n = 999; //全局變量

    function f1() {
        a = 100; //在這里a也是全局變量
        alert(n);
    }
    console.log(a); //100

在這里,函數內外部可以直接取到變量的值——全局變量

2、局部變量

//局部變量
    function f2() {
        var b = 22;
    }
    console.log(b);   //報錯

在這里,函數外部無(wú)法直接取到函數內部定義的值——局部變量

講到這里,當我們想要從外部取到局部變量的值,這時(shí)候該怎么辦呢?
請接著(zhù)往下看:

二、如何從外部獲取局部變量

接下來(lái)我們看一個(gè)例子:

var outer = 'Outer'; // 全局變量
var copy; 
function outerFn(){ // 全局函數
 var inner = 'Inner'; // 該變量只有函數作用域,無(wú)法從外部訪(fǎng)問(wèn)
 function innerFn(){ // outerFn()中的innerFn() 
 // 全局上下文和外圍上下文都可以在這里使用,
 // 因此可以訪(fǎng)問(wèn)到outer和inner 
 console.log(outer); 
 console.log(inner); 
 } 
 copy=innerFn; // 保存innerFn()的引用
 // 因為copy是在全局上下文中聲明的,所以在外部可以使用
} 
outerFn(); 
copy(); // 不能直接調用innerFn(),但是可以通過(guò)在全局作用域中聲明的變量來(lái)調用

來(lái)分析一下上面的例子。在innerFn()中可以訪(fǎng)問(wèn)變量outer,因為它處于全局上下文中。

在執行完outerFn()之后,執行了innerFn(),這是通過(guò)將該函數的引用復制到一個(gè)全局變量
copy中來(lái)實(shí)現的。在利用變量copy調用函數innerFn()執行時(shí),此刻已經(jīng)不在outerFn()的作
用域中了。因此下面的代碼不是應該失敗嗎?
console.log(inner);
變量inner的值應該是undefined吧?可是,上面代碼片段的輸出卻是:
“Outer”
“Inner”

這就是JavaScript的鏈式作用域結構,子對象會(huì )一級一級的向上尋找所有父對象的變量。所以父對象的所有變量對子對象都是可見(jiàn)的,反之則不成立。

這樣我們就可以獲取到函數內部的局部變量了。

三、閉包的概念

上面代碼塊中的copy()函數就是閉包。在我的理解,閉包就是能夠讀取到函數內部變量的函數。
而在JavaScript中,可以通過(guò)函數內部的子函數獲取到局部變量,因此可以把閉包理解為定義在函數內部的函數。
可以把它理解為一個(gè)將函數內部和外部連接起來(lái)的橋梁。

四、閉包的作用

在我看來(lái),閉包的作用主要體現在兩個(gè)方面:

1、可以讀取函數內部的變量

這個(gè)作用在上個(gè)代碼塊已經(jīng)表現得很清楚。

2、可以將局部變量的值一直保存在內存中

總所周知,局部變量只有當使用的時(shí)候才會(huì )在內存中開(kāi)辟出暫時(shí)的存儲空間,在函數運行結束后會(huì )自動(dòng)釋放空間。而閉包的出現可以使得局部變量可以像全局變量一樣一致存儲在內存中。

        function c1() {
            var z = 9999;
            nAdd = function() {
                z += 1;
            }

            function c2() {
                console.log(z);
            }
            return c2;
        }
        var result = c1();
        result(); //9999
        nAdd();
        result(); //10000

在上述代碼中,先執行一次c1(),此時(shí)z=9999;再執行一次nAdd(),使z+1;在執行一次c1()輸出此時(shí)z的值,z=10000。說(shuō)明z的值一直存儲在內存中,并沒(méi)有在第一次調用c1()后背自動(dòng)消除。

此時(shí)就要注意,閉包的使用會(huì )消耗很大的內存,不要濫用閉包。在退出函數之前,將不使用的局部變量全部刪除。

到此這篇關(guān)于詳解JavaScript閉包問(wèn)題的文章就介紹到這了,更多相關(guān)JavaScript閉包問(wèn)題內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

A级毛片无码免费真人| 又污又爽又黄的网站| 超级碰碰人妻中文字幕| 中文字幕在线无码一区二区三区| 97免费公开在线视频| 一本色道久久HEZYO无码|