欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解JavaScript作用域、作用域鏈和閉包的用法

 更新時(shí)間:2020年09月03日 15:49:36   作者:葉遮沉陽(yáng)  
這篇文章主要介紹了JavaScript作用域、作用域鏈和閉包的用法,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下

1. 作用域

作用域是指可訪問的變量和函數(shù)的集合。

作用域可分為全局作用域和局部作用域。

1.1 全局作用域

全局作用域是指最外層函數(shù)外面定義的變量和函數(shù)的集合。

換言之,這些最外層函數(shù)外面定義的變量和函數(shù)在任何地方都能訪問。

舉個(gè)例子:

// 最外層定義變量
var a = 1;

console.log(a); // 最外層可以訪問

function fnOne() { // 最外層函數(shù)
  
  console.log(a); // 函數(shù)內(nèi)可以訪問
  
  function fnTwo() { // 子函數(shù)
    console.log(a); // 子函數(shù)內(nèi)也可以訪問
  }
}



// 說明
在最外面定義一個(gè)變量,不僅在最外面可以訪問,
在函數(shù)內(nèi)也能訪問,在函數(shù)的子函數(shù)內(nèi)也能訪問。

1.2 局部作用域

局部作用域是指在函數(shù)內(nèi)部定義的變量和函數(shù)的集合。

換言之,這些在函數(shù)內(nèi)部定義的變量和函數(shù),在函數(shù)外面是無(wú)法訪問的,只能在函數(shù)內(nèi)部(包括函數(shù)的子孫函數(shù))訪問。

舉個(gè)例子:

function fnThree() {
  // 在函數(shù)內(nèi)定義變量
  var b = 2;
  
  console.log(b); // 函數(shù)內(nèi)部可以訪問
  
  function fnFour() {
    console.log(b); // 子函數(shù)內(nèi)也能訪問
  }
}
// 函數(shù)外不能訪問
//console.log(b); 


// 說明
在函數(shù) fnThree 中定義一個(gè)變量 b ,在函數(shù)內(nèi)可以訪問,
在子函數(shù) fnFour 中也能訪問,但在 函數(shù) fnThree 外是不能訪問的。

2. 作用域鏈

從上面的兩個(gè)例子可以看出,最里層的子函數(shù)不僅可以訪問最外層函數(shù)內(nèi)的變量,還能訪問最外層函數(shù)外的全局變量。

這是因?yàn)椋趧?chuàng)建最外層函數(shù)的時(shí)候,會(huì)把全局作用域拿過來,然后在創(chuàng)建子函數(shù)時(shí)候,又會(huì)把最外層的作用域(包括全局作用域)拿過來,就這樣一環(huán)扣一環(huán),就形成了作用域鏈。

所以,作用域鏈?zhǔn)侵竷?nèi)層函數(shù)擁有外層函數(shù)到最外層(最外層函數(shù)外,全局)的所有作用域列表。

3. 閉包

閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。(——百度百科)

從上面的第二個(gè)例子可知,函數(shù)外是不能訪問函數(shù)內(nèi)部定義的局部變量,但是閉包提供了可能。

舉個(gè)例子:

function User() {
	// 定義私有變量
	var userName = "default";
	
	// 提供 setUserName() 方法
	function setUserName(uName) {
		userName = uName;
	}
	
	// 提供 getUserName() 方法
	function getUserName() {
		return userName;
	}
	
	// 將方法對(duì)外開放
	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());

// 說明
User 函數(shù)內(nèi)部定義變量 uesrName ,
并在內(nèi)部定義兩個(gè)子函數(shù)操作 userName,
最后將兩個(gè)子函數(shù)返回(一個(gè)可直接放回,多個(gè)可放到對(duì)象中返回。)。

這樣,在函數(shù)外面可以調(diào)用子函數(shù)訪問函數(shù)內(nèi)部的變量,
這兩個(gè)子函數(shù)便實(shí)現(xiàn)了閉包的功能。

以上就是詳解JavaScript作用域、作用域鏈和閉包的用法的詳細(xì)內(nèi)容,更多關(guān)于JavaScript作用域、作用域鏈和閉包的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 最新版JavaScript中的箭頭函數(shù)

    最新版JavaScript中的箭頭函數(shù)

    ES6標(biāo)準(zhǔn)新增了一種新的函數(shù),Arrow?Function(箭頭函數(shù)),箭頭函數(shù)相當(dāng)于匿名函數(shù),并且簡(jiǎn)化了函數(shù)定義,本文重點(diǎn)給大家介紹JavaScript中的箭頭函數(shù),需要的朋友可以參考下
    2022-11-11
  • JS 中實(shí)現(xiàn)一個(gè)串型異步函數(shù)隊(duì)列

    JS 中實(shí)現(xiàn)一個(gè)串型異步函數(shù)隊(duì)列

    這篇文章主要介紹了JS 中實(shí)現(xiàn)一個(gè)串型異步函數(shù)隊(duì)列,文章通過async/await 串型請(qǐng)求展開詳情,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • innertext , insertadjacentelement , insertadjacenthtml , insertadjacenttext 等區(qū)別

    innertext , insertadjacentelement , insertadjacenthtml , ins

    innertext , insertadjacentelement , insertadjacenthtml , insertadjacenttext 等區(qū)別...
    2007-06-06
  • 小程序點(diǎn)贊收藏功能的實(shí)現(xiàn)代碼示例

    小程序點(diǎn)贊收藏功能的實(shí)現(xiàn)代碼示例

    這篇文章主要介紹了小程序點(diǎn)贊收藏功能的實(shí)現(xiàn)代碼示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • Javascript異步編程async實(shí)現(xiàn)過程詳解

    Javascript異步編程async實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了Javascript異步編程async實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Javascript 繪制 sin 曲線過程附圖

    Javascript 繪制 sin 曲線過程附圖

    這篇文章主要介紹了Javascript 繪制 sin 曲線過程,需要的朋友可以參考下
    2014-08-08
  • 詳解Typescript里的This的使用方法

    詳解Typescript里的This的使用方法

    這篇文章主要介紹了詳解Typescript里的This的使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • js如何刪除對(duì)象/數(shù)組中null、undefined、空對(duì)象及空數(shù)組實(shí)例代碼

    js如何刪除對(duì)象/數(shù)組中null、undefined、空對(duì)象及空數(shù)組實(shí)例代碼

    JS中數(shù)組是我們較為常用的一種數(shù)據(jù)結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于js如何刪除對(duì)象/數(shù)組中null、undefined、空對(duì)象及空數(shù)組的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 微信小程序分包加載代碼實(shí)現(xiàn)方法詳解

    微信小程序分包加載代碼實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了微信小程序分包加載代碼實(shí)現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • JS對(duì)象類型之Error錯(cuò)誤對(duì)象的用法詳解

    JS對(duì)象類型之Error錯(cuò)誤對(duì)象的用法詳解

    error對(duì)象是JavaScript的原生對(duì)象,當(dāng)程序解析和運(yùn)行過程中發(fā)生了錯(cuò)誤,JS引擎就會(huì)自動(dòng)產(chǎn)生并拋出一個(gè)error對(duì)象的實(shí)例,并且程序會(huì)終止在錯(cuò)誤發(fā)生的地方,本文給大家介紹了JS Error錯(cuò)誤對(duì)象的用法,需要的朋友可以參考下
    2024-04-04

最新評(píng)論