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

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

關于js閉包

關于js閉包

咩咩咩3124927 2016-09-24 17:24:01
<!DOCTYPE?html> <html> <head> ??<meta?charset="utf-8"> ??<title>JS?Bin</title> </head> <body> <script>?? ??function?f1(){ ????var?n=999; ????function?f2(){ ??????alert(n); ????} ????return?f2; ??} ??var?result=f1(); ??result(); </script> </body> </html>這是一個js的閉包問題,但是我看不懂最后兩部為什么輸出f1函數的時候為什么要聲明變量result,而且最后result后面還有括號,他們之間是什么邏輯關系呢?
查看完整描述

1 回答

已采納
?
千秋此意

TA貢獻158條經驗 獲得超188個贊


f1()通過return暴露出一個公有的函數f2出去,在f2函數里引用了變量n,因為f2實際上是定義在f1內部的所以當f2的作用域里找不到變量n的時候會沿著作用域鏈往上找到f1作用域里的變量n,只要f2里對n的引用還在即使f1已經運行完畢但是里面的變量n也不會被銷毀(垃圾回收);

//?至于為什么result要調用,代碼這樣寫就比較直觀:
function?f1()?{
??var?n=999;
??return?function(){
????console.log(n);
??}
}
var?result?=?f1();?//?這一步f1()返回的實際上就是本來的f2那個函數,所以要在下面再調用f2才能執行里面的代碼。
result();
//?直接寫?f1()()也可以的


查看完整回答
反對 回復 2016-09-24
  • 咩咩咩3124927
    咩咩咩3124927
    function f1(){     var n=999;     function f2(){       alert(n);     }     return f2();   } f1(); 你好,我再問下,我這樣直接在后面調用f1();也可以輸出結果,請問跟申明變量reuslt然后再調用輸出有什么區別嗎?
  • 千秋此意
    千秋此意
    有區別的,如果按你這樣寫,最后f2里面的代碼“alert(n)”還是執行了,不過他執行的時間是在你調用f1()的時候就執行了,你f1里面的return返回的值其實是undefined,而原來那個寫法f1調用返回的值是f2這個函數體,所以兩種寫法雖然都可以讓f2里面的代碼執行但是執行的過程是不一樣的,f1的返回值也不同
  • 咩咩咩3124927
    咩咩咩3124927
    多謝了
  • 1 回答
  • 1 關注
  • 1213 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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