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*/想請教各位前輩看看這樣的理解是不是正確的。補充:可不可以理解為,閉包第一次執行的時候需要往上層查找變量,找到之后,上層的變量值就變成了子函數的變量值,以后就不需要再去上一層查找,因為已經在第一次執行的時候繼承了,變成自己的。感覺有點亂。。。(捂臉
關于閉包的理解?求解惑。
慕森卡
2018-11-06 13:14:45