溫馨提示×

溫馨提示×

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

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

JavaScript中閉包的使用

發布時間:2021-07-19 10:00:06 來源:億速云 閱讀:165 作者:chen 欄目:web開發

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


通過深入了解 JavaScript 的高級概念之一:閉包,更好地理解 JavaScript 代碼的工作和執行方式。

在《JavaScript 如此受歡迎的 4 個原因》中,我提到了一些高級 JavaScript 概念。在本文中,我將深入探討其中的一個概念:閉包closure。

根據 Mozilla 開發者網絡(MDN),“閉包是將一個函數和對其周圍的狀態(詞法環境)的引用捆綁在一起(封閉)的組合?!焙喍灾?,這意味著在一個函數內部的函數可以訪問其外部(父)函數的變量。

為了更好地理解閉包,可以看看作用域及其執行上下文。

下面是一個簡單的代碼片段:

var hello = "Hello"; function sayHelloWorld() {    var world = "World";    function wish() {        var year = "2021";        console.log(hello + " " + world + " "+ year);    }    wish();}sayHelloWorld();

下面是這段代碼的執行上下文:

JavaScript中閉包的使用

JS 代碼的執行上下文

每次創建函數時(在函數創建階段)都會創建閉包。每個閉包有三個作用域。

  • 本地作用域(自己的作用域)

  • 外部函數范圍

  • 全局范圍

我稍微修改一下上面的代碼來演示一下閉包:

var hello = "Hello"; var sayHelloWorld = function() {    var world = "World";    function wish() {        var year = "2021";        console.log(hello + " " + world + " "+ year);    }    return wish;}var callFunc = sayHelloWorld();callFunc();

內部函數 wish() 在執行之前就從外部函數返回。這是因為 JavaScript 中的函數形成了閉包。

  • 當 sayHelloWorld 運行時,callFunc 持有對函數 wish 的引用。

  • wish 保持對其周圍(詞法)環境的引用,其中存在變量 world。

私有變量和方法

本身,JavaScript 不支持創建私有變量和方法。閉包的一個常見和實用的用途是模擬私有變量和方法,并允許數據隱私。在閉包范圍內定義的方法是有特權的。

這個代碼片段捕捉了 JavaScript 中閉包的常用編寫和使用方式:

var resourceRecord = function(myName, myAddress) {    var resourceName = myName;    var resourceAddress = myAddress;    var accessRight = "HR";    return {        changeName: function(updateName, privilege) {            // only HR can change the name            if (privilege === accessRight ) {                resourceName = updateName;                return true;            } else {                return false;            }        },          changeAddress: function(newAddress) {            // any associate can change the address            resourceAddress = newAddress;                  },          showResourceDetail: function() {            console.log ("Name:" + resourceName + " ; Address:" + resourceAddress);        }    }}// Create first recordvar resourceRecord1 = resourceRecord("Perry","Office");// Create second recordvar resourceRecord2 = resourceRecord("Emma","Office");// Change the address on the first recordresourceRecord1.changeAddress("Home");resourceRecord1.changeName("Perry Berry", "Associate"); // Output is false as only an HR can change the nameresourceRecord2.changeName("Emma Freeman", "HR"); // Output is true as HR changes the nameresourceRecord1.showResourceDetail(); // Output - Name:Perry ; Address:HomeresourceRecord2.showResourceDetail(); // Output - Name:Emma Freeman ; Address:Office

資源記錄(resourceRecord1 和 resourceRecord2)相互獨立。每個閉包通過自己的閉包引用不同版本的 resourceName 和 resourceAddress 變量。你也可以應用特定的規則來處理私有變量,我添加了一個誰可以修改 resourceName 的檢查。

使用閉包

理解閉包是很重要的,因為它可以更深入地了解變量和函數之間的關系,以及 JavaScript 代碼如何工作和執行。

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

向AI問一下細節

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

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女