<!doctype html>
<html>
<head>
</head>
<body>
<script type="text/javascript">
<!-- 在正常的腳本中,某個(gè)方法可以獲取到外部的變量,或者全局變量 -->
var num = 11;
function func1(){
console.log(num);
}
func1();
<!-- 但是在外部是無法獲取方法內(nèi)部的局部變量的 -->
function func2(){
var num1 = 22;
num2 = 33;
}
func2();
<!--console.log(num1); 會(huì)報(bào)錯(cuò)!-->
console.log(num2); <!--可以獲取到num2的值,因?yàn)椴贿m用var定義變量時(shí),默認(rèn)是全局變量 -->
<!-- 那么如何在外部獲取到內(nèi)部的變量呢!javascript可以辦到 -->
function func3(){
var num3 = 44;
function func4(){
return num3;
}
return func4;
}
var func = func3();
console.log(func());
</script>
</body>
</html>
第三個(gè)中...為什么不直接return num3呢。。。
在外面包一個(gè)func4有什么區(qū)別。。。。。。不都是返回num3嗎。。求大神解惑。。這各問題把我弄蒙了
1、如果你所有的變量都定義在最外層,也就是window環(huán)境下,你要想一想,如果程序變得越來越大,你一個(gè)不小心就把某一個(gè)變量修改了,bug很難定位
2、閉包簡單來說,就是內(nèi)層函數(shù)能夠訪問到作用域鏈上的變量。你的例子太簡單了,如果單單只返回值,怎么返回都沒什么區(qū)別,但是如果你是暴露接口方法,使之能操作你函數(shù)里面的變量呢?這就又不一樣了,只返回值你永遠(yuǎn)不能在外層對這個(gè)變量進(jìn)行修改,相當(dāng)于把你的變量封裝了起來,外層不能改變他,也就解決了1里的問題
3、如2中所說,你可以
function func3 () {
var num = 1
function add () {
num++
}
function getNum () {
return num
}
return {
add: add,
getNum: getNum
}
}
var t = func3()
t.add()
t.getNum()
這樣是不是就封裝了一些操作了,也變得更加有意義呢?例子還是太簡單,只是說明對變量的封裝。
關(guān)于閉包主要記住以下兩點(diǎn)
ES5中只有函數(shù)作用域,在當(dāng)前函數(shù)里找不到變量時(shí)會(huì)逐級(jí)向上查找,直到全局(window)
當(dāng)把函數(shù)被當(dāng)做參數(shù)來傳遞時(shí)就會(huì)產(chǎn)生閉包,連同函數(shù)可訪問的作用域一起傳遞(也就是閉包)
分析一下你的第三個(gè)例子
在func3外面本來是不能訪問到內(nèi)部變量num3的
但是func4是可以的,因?yàn)樗趂unc3內(nèi)部,根據(jù)上面第1條,是可以訪問num3。
由于func4被func3返回并傳給了func,所以func就具備了func4的可訪問的作用域,自然就可以訪問到num3
如果你還是不明白,推薦看一下《你不知道的JavaScript》上卷,閉包那一章講得很清楚
首先你要明白,javascript在使用變量時(shí)是逐層往上找的,這就導(dǎo)致了外面無法訪問里面的變量,那么這里有一個(gè)垃圾回收機(jī)制,當(dāng)一個(gè)變量沒有任何引用的時(shí)候,這個(gè)變量就會(huì)被回收。
ok,看第三個(gè)例子,其實(shí)他想表達(dá)的意思是,num3這個(gè)變量被func4使用著,而func4被返回給了func,這樣num3這個(gè)變量就不會(huì)被回收,也就從外面拿到了里面的變量。至于你說的直接返回return num3.這樣相當(dāng)于是直接返回了一個(gè)變量,那我還不如直接返回一個(gè)具體的值嘞~
表達(dá)能力不行,見諒
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。