詳解JavaScript作用域、作用域鏈和閉包的用法
1. 作用域
作用域是指可訪問(wèn)的變量和函數(shù)的集合。
作用域可分為全局作用域和局部作用域。
1.1 全局作用域
全局作用域是指最外層函數(shù)外面定義的變量和函數(shù)的集合。
換言之,這些最外層函數(shù)外面定義的變量和函數(shù)在任何地方都能訪問(wèn)。
舉個(gè)例子:
// 最外層定義變量var a = 1;console.log(a); // 最外層可以訪問(wèn)function fnOne() { // 最外層函數(shù) console.log(a); // 函數(shù)內(nèi)可以訪問(wèn) function fnTwo() { // 子函數(shù) console.log(a); // 子函數(shù)內(nèi)也可以訪問(wèn) }}// 說(shuō)明在最外面定義一個(gè)變量,不僅在最外面可以訪問(wèn),在函數(shù)內(nèi)也能訪問(wèn),在函數(shù)的子函數(shù)內(nèi)也能訪問(wèn)。
1.2 局部作用域
局部作用域是指在函數(shù)內(nèi)部定義的變量和函數(shù)的集合。
換言之,這些在函數(shù)內(nèi)部定義的變量和函數(shù),在函數(shù)外面是無(wú)法訪問(wèn)的,只能在函數(shù)內(nèi)部(包括函數(shù)的子孫函數(shù))訪問(wèn)。
舉個(gè)例子:
function fnThree() { // 在函數(shù)內(nèi)定義變量 var b = 2; console.log(b); // 函數(shù)內(nèi)部可以訪問(wèn) function fnFour() { console.log(b); // 子函數(shù)內(nèi)也能訪問(wèn) }}// 函數(shù)外不能訪問(wèn)//console.log(b); // 說(shuō)明在函數(shù) fnThree 中定義一個(gè)變量 b ,在函數(shù)內(nèi)可以訪問(wèn),在子函數(shù) fnFour 中也能訪問(wèn),但在 函數(shù) fnThree 外是不能訪問(wèn)的。
2. 作用域鏈
從上面的兩個(gè)例子可以看出,最里層的子函數(shù)不僅可以訪問(wèn)最外層函數(shù)內(nèi)的變量,還能訪問(wèn)最外層函數(shù)外的全局變量。
這是因?yàn)椋趧?chuàng)建最外層函數(shù)的時(shí)候,會(huì)把全局作用域拿過(guò)來(lái),然后在創(chuàng)建子函數(shù)時(shí)候,又會(huì)把最外層的作用域(包括全局作用域)拿過(guò)來(lái),就這樣一環(huán)扣一環(huán),就形成了作用域鏈。
所以,作用域鏈?zhǔn)侵竷?nèi)層函數(shù)擁有外層函數(shù)到最外層(最外層函數(shù)外,全局)的所有作用域列表。
3. 閉包
閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。(——百度百科)
從上面的第二個(gè)例子可知,函數(shù)外是不能訪問(wèn)函數(shù)內(nèi)部定義的局部變量,但是閉包提供了可能。
舉個(gè)例子:
function User() {// 定義私有變量var userName = 'default';// 提供 setUserName() 方法function setUserName(uName) {userName = uName;}// 提供 getUserName() 方法function getUserName() {return userName;}// 將方法對(duì)外開(kāi)放return {set: setUserName,get: getUserName}}var user1 = User();user1.set(’tom’);console.log(user1.get());var user2 = User();user2.set(’jack’);console.log(user2.get());// 說(shuō)明User 函數(shù)內(nèi)部定義變量 uesrName ,并在內(nèi)部定義兩個(gè)子函數(shù)操作 userName,最后將兩個(gè)子函數(shù)返回(一個(gè)可直接放回,多個(gè)可放到對(duì)象中返回。)。這樣,在函數(shù)外面可以調(diào)用子函數(shù)訪問(wèn)函數(shù)內(nèi)部的變量,這兩個(gè)子函數(shù)便實(shí)現(xiàn)了閉包的功能。
以上就是詳解JavaScript作用域、作用域鏈和閉包的用法的詳細(xì)內(nèi)容,更多關(guān)于JavaScript作用域、作用域鏈和閉包的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. 基于 Python 實(shí)踐感知器分類(lèi)算法2. Python如何批量生成和調(diào)用變量3. ASP.NET MVC實(shí)現(xiàn)橫向展示購(gòu)物車(chē)4. 通過(guò)CSS數(shù)學(xué)函數(shù)實(shí)現(xiàn)動(dòng)畫(huà)特效5. ASP.Net Core對(duì)USB攝像頭進(jìn)行截圖6. python利用opencv實(shí)現(xiàn)顏色檢測(cè)7. ASP.Net Core(C#)創(chuàng)建Web站點(diǎn)的實(shí)現(xiàn)8. Python 中如何使用 virtualenv 管理虛擬環(huán)境9. Python獲取B站粉絲數(shù)的示例代碼10. windows服務(wù)器使用IIS時(shí)thinkphp搜索中文無(wú)效問(wèn)題
