摘要:對(duì)于一個(gè)個(gè)剛剛接觸前端的新手,天天聽(tīng)人講閉包,聽(tīng)的那個(gè)高大尚,心中對(duì)各位技術(shù)大佬是那個(gè)的膜拜,于是做為前端菜鳥(niǎo)的我,就去了解了傳說(shuō)中的閉包。
對(duì)于一個(gè)個(gè)剛剛接觸前端的新手,天天聽(tīng)人講閉包,聽(tīng)的那個(gè)高大尚,心中對(duì)各位技術(shù)大佬是那個(gè)的膜拜,于是做為前端菜鳥(niǎo)的我,就去了解了傳說(shuō)中的閉包。
何為閉包?
通俗易懂的講,就是可以調(diào)用函數(shù)內(nèi)部的變量和方法
舉例說(shuō)明如下:
function test(){ var x = 1; var y = 2; function func1(){ x++; console.log("x:"+x); } function func2(){ y++; console.log("y:"+y); } func3 = function(){ console.log("x+y:"+(x+y)); } return { func1:func1 } } var obj1 = test(); obj1.func1();//輸出x:2 obj1.func1();//輸出x:3 func3();//輸出x+y:5 var obj2 = test(); obj2.func1();//輸出x:2 obj2.func1();//輸出x:3 obj2.func1();//輸出x:4 func3();//輸出x+y:6 obj1.func1();//輸出x:4 func3();//輸出x+y:6
解析:你可以把test理解成一個(gè)對(duì)象,首先建立一個(gè)obj1對(duì)象,這個(gè)時(shí)候調(diào)用obj1.func1()時(shí),test中的x會(huì)被累加,這個(gè)就是閉包的一個(gè)特點(diǎn),就是外部可以改變函數(shù)內(nèi)部的變量值,這里要記住一點(diǎn),只有在test中return返回的函數(shù)在外部才能被調(diào)用,如果此時(shí)調(diào)用obj1.func2()會(huì)提示出錯(cuò)的,只有跟func1一樣在return中返回才能被外部調(diào)用;func3可以理解為公有的函數(shù),但是只有在聲明完test之后才能被調(diào)用,因?yàn)閒unc3第一次定義是在test中定義的,所有要先test()之后才能被調(diào)用;obj2是新建立的一個(gè)對(duì)象,此時(shí)的obj1和obj2兩個(gè)對(duì)象是互不干擾的,各自疊加,這也是閉包的一個(gè)特性,可以用在以后建立多個(gè)計(jì)時(shí)器時(shí)使用閉包,事半功倍;這里要特別強(qiáng)調(diào)一下func3這個(gè)函數(shù),第一個(gè)func3調(diào)用的是對(duì)象obj1中的func3,而當(dāng)obj2新對(duì)象聲明之后,func3調(diào)用的就是obj2中的func3了
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/84528.html
摘要:函數(shù)在執(zhí)行的時(shí)候執(zhí)行函數(shù),將當(dāng)前的變量對(duì)象由于當(dāng)前的環(huán)境是函數(shù),所以將其活動(dòng)對(duì)象作為變量對(duì)象添加到作用域鏈的前端。此時(shí),由于在執(zhí)行,而作用域鏈也存在,所以可以在作用域鏈上進(jìn)行查找,去訪問(wèn)的變量。 一、現(xiàn)狀 閉包是jser繞不過(guò)的坎,一直在都在說(shuō),套用 simpson 的話來(lái)說(shuō):JavaScript中閉包無(wú)處不在,你只需要能夠識(shí)別并擁抱它。 閉包是基于詞法作用域書(shū)寫(xiě)代碼時(shí)的自然結(jié)果,你甚...
摘要:將他們放在堆中是為了不影響棧的效率。接著是臨時(shí)空間函數(shù)執(zhí)行的時(shí)候,會(huì)臨時(shí)開(kāi)辟一塊內(nèi)存空間,這塊內(nèi)存空間長(zhǎng)得和外面這個(gè)一樣,也有自己的棧堆,當(dāng)函數(shù)運(yùn)行完就銷毀。中的內(nèi)存第一個(gè)部分還是和上面的一樣,有棧堆運(yùn)行時(shí)環(huán)境,另外還有一個(gè)緩沖區(qū)存放。 0.前言 主要結(jié)合了內(nèi)存的概念講了js的一些的很簡(jiǎn)單、但是又不小心就犯錯(cuò)的地方。結(jié)論:js執(zhí)行順序,先定義,后執(zhí)行,從上到下,就近原則。閉包可以讓外部...
摘要:在內(nèi)部,理所當(dāng)然能訪問(wèn)到局部變量,但當(dāng)作為的返回值賦給外的全局變量時(shí),神奇的事情發(fā)生了在全局作用域中訪問(wèn)到了,這就是閉包。而閉包最神奇的地方就是能在一個(gè)函數(shù)外訪問(wèn)函數(shù)中的局部變量,把這些變量用閉包的形式放在函數(shù)中便能避免污染。 一、閉包是什么? 《JavaScript高級(jí)程序設(shè)計(jì)》中寫(xiě)道:閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù),如果用下定義的觀點(diǎn)看,這句話就是說(shuō)閉包是函數(shù),我...
本文不會(huì)過(guò)多講解基礎(chǔ)知識(shí),更多說(shuō)的是在使用useRef如何能擺脫 這個(gè) 閉包陷阱 ? react hooks 的閉包陷阱 基本每個(gè)開(kāi)發(fā)員都有遇見(jiàn),這是很令人抓狂的。 (以下react示范demo,均為react 16.8.3 版本) 列一個(gè)具體的場(chǎng)景: functionApp(){ const[count,setCount]=useState(1); useEffect(()=...
摘要:我們可以用普通函數(shù)內(nèi)部嵌套匿名函數(shù),形成一個(gè)閉包來(lái)使變量駐留在內(nèi)存中。局部變量閉包為什么要將賦值給變量呢這里我們就要談到匿名函數(shù)調(diào)用問(wèn)題匿名函數(shù)如何調(diào)用還是上面的例子會(huì)將整個(gè)函數(shù)體打印出來(lái)這樣才調(diào)用了函數(shù)內(nèi)部的匿名函數(shù)看到這里。 閉包含義: 閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù),創(chuàng)建閉包的常見(jiàn)的方式,就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù),通過(guò)另一個(gè)函數(shù)訪問(wèn)這個(gè)函數(shù)的局部變量。 這...
閱讀 3719·2021-10-18 13:34
閱讀 2413·2021-08-11 11:15
閱讀 1207·2019-08-30 15:44
閱讀 699·2019-08-26 10:32
閱讀 994·2019-08-26 10:13
閱讀 2069·2019-08-23 18:36
閱讀 1781·2019-08-23 18:35
閱讀 531·2019-08-23 17:10