您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“JavaScript中閉包的使用”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
通過深入了解 JavaScript 的高級(jí)概念之一:閉包,更好地理解 JavaScript 代碼的工作和執(zhí)行方式。
在《JavaScript 如此受歡迎的 4 個(gè)原因》中,我提到了一些高級(jí) JavaScript 概念。在本文中,我將深入探討其中的一個(gè)概念:閉包。
根據(jù) Mozilla 開發(fā)者網(wǎng)絡(luò)(MDN),“閉包是將一個(gè)函數(shù)和對(duì)其周圍的狀態(tài)(詞法環(huán)境)的引用捆綁在一起(封閉)的組合。”簡(jiǎn)而言之,這意味著在一個(gè)函數(shù)內(nèi)部的函數(shù)可以訪問其外部(父)函數(shù)的變量。
為了更好地理解閉包,可以看看作用域及其執(zhí)行上下文。
下面是一個(gè)簡(jiǎn)單的代碼片段:
var hello = "Hello"; function sayHelloWorld() { var world = "World"; function wish() { var year = "2021"; console.log(hello + " " + world + " "+ year); } wish();}sayHelloWorld();
下面是這段代碼的執(zhí)行上下文:
JS 代碼的執(zhí)行上下文
每次創(chuàng)建函數(shù)時(shí)(在函數(shù)創(chuàng)建階段)都會(huì)創(chuàng)建閉包。每個(gè)閉包有三個(gè)作用域。
本地作用域(自己的作用域)
外部函數(shù)范圍
全局范圍
我稍微修改一下上面的代碼來演示一下閉包:
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();
內(nèi)部函數(shù) wish()
在執(zhí)行之前就從外部函數(shù)返回。這是因?yàn)?JavaScript 中的函數(shù)形成了閉包。
當(dāng) sayHelloWorld
運(yùn)行時(shí),callFunc
持有對(duì)函數(shù) wish
的引用。
wish
保持對(duì)其周圍(詞法)環(huán)境的引用,其中存在變量 world
。
本身,JavaScript 不支持創(chuàng)建私有變量和方法。閉包的一個(gè)常見和實(shí)用的用途是模擬私有變量和方法,并允許數(shù)據(jù)隱私。在閉包范圍內(nèi)定義的方法是有特權(quán)的。
這個(gè)代碼片段捕捉了 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
)相互獨(dú)立。每個(gè)閉包通過自己的閉包引用不同版本的 resourceName
和 resourceAddress
變量。你也可以應(yīng)用特定的規(guī)則來處理私有變量,我添加了一個(gè)誰可以修改 resourceName
的檢查。
理解閉包是很重要的,因?yàn)樗梢愿钊氲亓私庾兞亢秃瘮?shù)之間的關(guān)系,以及 JavaScript 代碼如何工作和執(zhí)行。
“JavaScript中閉包的使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。