中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript閉包是什么意思

發布時間:2021-07-01 08:59:19 來源:億速云 閱讀:165 作者:chen 欄目:開發技術

本篇內容介紹了“JavaScript閉包是什么意思”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

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

一、變量的作用域

在介紹閉包之前,我們先理解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);   //報錯

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

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

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

接下來我們看一個例子:

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

來分析一下上面的例子。在innerFn()中可以訪問變量outer,因為它處于全局上下文中。

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

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

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

三、閉包的概念

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

四、閉包的作用

在我看來,閉包的作用主要體現在兩個方面:

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

這個作用在上個代碼塊已經表現得很清楚。

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

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

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(),此時z=9999;再執行一次nAdd(),使z+1;在執行一次c1()輸出此時z的值,z=10000。說明z的值一直存儲在內存中,并沒有在第一次調用c1()后背自動消除。

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

“JavaScript閉包是什么意思”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

邵东县| 城口县| 栾城县| 志丹县| 绥棱县| 介休市| 囊谦县| 习水县| 友谊县| 穆棱市| 安庆市| 津市市| 曲靖市| 库尔勒市| 会同县| 伊吾县| 锦屏县| 紫云| 卓资县| 贡山| 乌拉特中旗| 德庆县| 西畴县| 嘉禾县| 扶余县| 南乐县| 涞水县| 澄迈县| 哈尔滨市| 平陆县| 同心县| 门源| 五莲县| 鸡泽县| 八宿县| 靖江市| 安化县| 噶尔县| 乌鲁木齐市| 舞阳县| 库车县|