国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

通過示例徹底搞懂js閉包

2024-05-06 16:38:53
字體:
來源:轉載
供稿:網友

例1

function sayHello(name) { var text = 'Hello ' + name; var sayAlert = function() { console.log(text); } sayAlert();}sayHello("Bob") // 輸出"Hello Bob"

在sayHello()函數中定義并調用了sayAlert()函數;sayAlert()作為內層函數,可以訪問外層函數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](); }

得到的結果:連續輸出3個"item3 undefined"

解析:通過執行buildList函數,返回了一個result,那么這個result存放的是3個匿名函數。然而這三個匿名函數其實就是三個閉包,因為它可以訪問到父函數的局部變量。所以閉包內的保留的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]);

得到的結果:

item1 1item2 2item3 3

解釋:這兒雖然傳遞了一個數組進去,但是返回的是三個自執行的函數。

例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"

每次調用newClosure()都會創建獨立的閉包,它們的局部變量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函數之后定義,這并未影響代碼執行。因為返回函數sayAlice2所指向的閉包會包含sayAlice()函數中的所有局部變量,這自然包括了alice變量,因此可以正常打印”Hello Alice”。

例6

function setupSomeGlobals() { var num = 666; gAlertNumber = function() { console.log(num); } gIncreaseNumber = function() { num++; } gSetNumber = function(x) { num = x; }}setupSomeGlobals();gAlertNumber(); // 輸出666gIncreaseNumber();gAlertNumber(); // 輸出667gSetNumber(5);gAlertNumber(); // 輸出5

解釋:首先gAlertNumber,gIncreaseNumber,gSetNumber是三個全局變量,并且其三個值都是匿名函數,然而這三個匿名函數本身都是閉包。他們操作的num都是保存在內存中的同一個num,所有會得出上面的結果。

以上這篇通過示例徹底搞懂js閉包就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 利川市| 包头市| 柏乡县| 张家界市| 肥城市| 闽清县| 乌什县| 赤峰市| 德阳市| 西乌珠穆沁旗| 禹城市| 蒲江县| 金溪县| 东乌珠穆沁旗| 黑山县| 闽清县| 双牌县| 海伦市| 竹溪县| 三河市| 上杭县| 古浪县| 周口市| 棋牌| 托里县| 大安市| 阳新县| 通城县| 建水县| 九龙县| 深圳市| 绍兴市| 伊金霍洛旗| 广灵县| 新宁县| 涞源县| 瓦房店市| 巴彦县| 顺昌县| 密山市| 邯郸市|