亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于閉包的理解?求解惑。

關于閉包的理解?求解惑。

慕森卡 2018-11-06 13:14:45
function f1(){//2、找到 f1 函數,執行。    var n=999;//3、給變量 n 賦值。    nAdd=function(){n+=1}//9、找到 nAdd ,匿名函數內沒有變量 n ,需要去上層查找,n = 999 +1。    function f2(){//5、找到 f2 函數,執行。        alert(n);//6、執行動作。    }    console.log(n);//新加上,測試,不參與執行步驟。    return f2;//4、返回 f2 函數,需要尋找 f2 函數。}var result=f1();//1、將 f1函數的返回值賦值給 result 變量,result 也變成函數,需要尋找f1函數。result(); //7、第一次執行 result 函數,將步驟 6 的執行動作(步驟 6)結果輸出,n 等于 999。nAdd();//8、執行 f1 函數里的全局變量函數 nAdd ,需要尋找 nAdd 函數。result(); //10、第二次執行 result 函數,將步驟 5 的執行動作(步驟 6)結果輸出,此時 n 等于 1000,因為第一次執行 result 函數時,查找了上層的作用域,n 是 999。nAdd();//11、如果再執行 nAdd 函數,此時 nAdd 這個函數里的 n 是 1000,而 f1 函數的 n 還是 999,也就是說 f1 的變量 n 和 nAdd 的 n 是兩個作用域不同的同名變量。result(); f1();//新加上,測試/*結果控制臺輸出:999彈窗:999彈窗:1000彈窗:1001控制臺輸出:999*/想請教各位前輩看看這樣的理解是不是正確的。補充:可不可以理解為,閉包第一次執行的時候需要往上層查找變量,找到之后,上層的變量值就變成了子函數的變量值,以后就不需要再去上一層查找,因為已經在第一次執行的時候繼承了,變成自己的。感覺有點亂。。。(捂臉
查看完整描述

1 回答

?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

function f1(){

    var n=999;

    nAdd=function(){n+=1}

    function f2(){

        alert(n);

    }

    console.log(n);

    return f2;

}

var result=f1();

result(); 

nAdd();

result();

nAdd();

result(); 

var b = f1();//新加上,測試

此時b和result中的n不是同一個
b和nAdd的n是同一個.
result的n已經無法改變.

查看完整回答
反對 回復 2018-12-14
  • 1 回答
  • 0 關注
  • 446 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號