新聞中心
例1
在東營(yíng)等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,成都營(yíng)銷網(wǎng)站建設(shè),外貿(mào)營(yíng)銷網(wǎng)站建設(shè),東營(yíng)網(wǎng)站建設(shè)費(fèi)用合理。
function sayHello(name) { var text = 'Hello ' + name; var sayAlert = function() { console.log(text); } sayAlert(); } sayHello("Bob") // 輸出"Hello Bob"
在sayHello()函數(shù)中定義并調(diào)用了sayAlert()函數(shù);sayAlert()作為內(nèi)層函數(shù),可以訪問(wèn)外層函數(shù)sayHello()中的text變量。
例2
function sayHello2(name) { var text = 'Hello ' + name; // 局部變量 var sayAlert = function() { console.log(text); } return sayAlert; } var say2 = sayHello2("Jane"); say2(); // 輸出"Hello Jane"
例3
function buildList(list) { var result = []; for(var i = 0; i < list.length; i++) { var item = 'item' + list[i]; result.push( function() { console.log(item + ' ' + list[i]); } ); } return result; } var fnlist = buildList([1,2,3]); for (var j = 0; j < fnlist.length; j++) { fnlist[j](); }
得到的結(jié)果:連續(xù)輸出3個(gè)"item3 undefined"
解析:通過(guò)執(zhí)行buildList函數(shù),返回了一個(gè)result,那么這個(gè)result存放的是3個(gè)匿名函數(shù)。然而這三個(gè)匿名函數(shù)其實(shí)就是三個(gè)閉包,因?yàn)樗梢栽L問(wèn)到父函數(shù)的局部變量。所以閉包內(nèi)的保留的i是最終的值為3.所以list[3]肯定是undefined. item變量值為item3.
改成如下代碼:
function buildList(list) { var result = []; for(var i = 0; i < list.length; i++) { var item = 'item' + list[i]; result.push( (function(i) { console.log(item + ' ' + list[i]); })(i) ); } return result; } var fnlist = buildList([1,2,3]);
得到的結(jié)果:
item1 1 item2 2 item3 3
解釋:這兒雖然傳遞了一個(gè)數(shù)組進(jìn)去,但是返回的是三個(gè)自執(zhí)行的函數(shù)。
例4
function newClosure(someNum, someRef) { var anArray = [1,2,3]; var num = someNum; var ref = someRef; return function(x) { num += x; anArray.push(num); console.log('num: ' + num + "; " + 'anArray ' + anArray.toString() + "; " + 'ref.someVar ' + ref.someVar); } } closure1 = newClosure(40, {someVar: "closure 1"}); closure2 = newClosure(1000, {someVar: "closure 2"}); closure1(5); // 打印"num: 45; anArray 1,2,3,45; ref.someVar closure 1" closure2(-10); // 打印"num: 990; anArray 1,2,3,990; ref.someVar closure 2"
每次調(diào)用newClosure()都會(huì)創(chuàng)建獨(dú)立的閉包,它們的局部變量num與ref的值并不相同。
例5
function sayAlice() { var sayAlert = function() { console.log(alice); } var alice = 'Hello Alice'; return sayAlert; } var sayAlice2 = sayAlice(); sayAlice2(); // 輸出"Hello Alice"
alice變量在sayAlert函數(shù)之后定義,這并未影響代碼執(zhí)行。因?yàn)榉祷睾瘮?shù)sayAlice2所指向的閉包會(huì)包含sayAlice()函數(shù)中的所有局部變量,這自然包括了alice變量,因此可以正常打印”Hello Alice”。
例6
function setupSomeGlobals() { var num = 666; gAlertNumber = function() { console.log(num); } gIncreaseNumber = function() { num++; } gSetNumber = function(x) { num = x; } } setupSomeGlobals(); gAlertNumber(); // 輸出666 gIncreaseNumber(); gAlertNumber(); // 輸出667 gSetNumber(5); gAlertNumber(); // 輸出5
解釋:首先gAlertNumber,gIncreaseNumber,gSetNumber是三個(gè)全局變量,并且其三個(gè)值都是匿名函數(shù),然而這三個(gè)匿名函數(shù)本身都是閉包。他們操作的num都是保存在內(nèi)存中的同一個(gè)num,所有會(huì)得出上面的結(jié)果。
以上這篇通過(guò)示例徹底搞懂js閉包就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持創(chuàng)新互聯(lián)。
文章名稱:通過(guò)示例徹底搞懂js閉包
網(wǎng)站路徑:http://www.dlmjj.cn/article/jieojc.html