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