JavaScript - 十分鐘帶你了解 閉包 (Closure)

แชร์
ฝัง
  • เผยแพร่เมื่อ 20 ส.ค. 2024
  • 我們是六角學院,這是我們線上問答的影片
    本次主題是 JavaScript Closure
    課程分享筆記
    paper.dropbox....
    六角學院官網:www.hexschool.com/

ความคิดเห็น • 11

  • @user-fi2ty4bm2n
    @user-fi2ty4bm2n 3 ปีที่แล้ว +11

    1. 簡單來說,closure就是把至少兩個functions寫在一起,子function可以存取母function的變數。內部的變數不像是global variable可以供其他function做使用。
    2. 課程中直接callMethod(),會得到一個函數,這個函數其實是子函數。
    3. 所以myMoney(value)會是可以用母函數scope的money再次扣除value後,更新money的值。
    -----
    這牽涉到幾個寫程式中很重要的概念。
    1. decoupling。每個function之間要能獨立開發,不能因為要改功能,全部都要大改。
    2. 如果舉的例子是array或是list的話,closure能確保在記憶體中的變數是不可被外部更改的(immutable),不像global variable或是OOP中有可能被直接更改。
    3. reusability 。每個function要盡可能達到重複使用,以降低開發時間及成本。
    -----
    如果這個概念還是不懂的話,建議可以找找 functional programming (FP) 的相關簡介。closure與 FP 通常是搭配著一起使用的。

  • @susulin4423
    @susulin4423 5 ปีที่แล้ว +9

    我看了好幾遍仍然看不懂,看來我沒有才能QQ

    • @user-fi2ty4bm2n
      @user-fi2ty4bm2n 3 ปีที่แล้ว

      並不是。只是這個方式有它的目的,且與 functional programming有關,詳細請見我在這個影片下的留言:)

  • @TwFoxTw
    @TwFoxTw 6 ปีที่แล้ว +3

    不理解也沒關係,閉包遲早會成為歷史的眼淚,ES6的let和const已經解決scope問題了,閉包在ES6起已經毫無用武之地

  • @elliotliang1972
    @elliotliang1972 6 ปีที่แล้ว

    记忆体是否就是函数表达式呢?老师

  • @yotsaisu9346
    @yotsaisu9346 4 ปีที่แล้ว

    不好意思 我想請問一下changeMoney函式不會直接讓money變成全域變數嗎? 為什麼能直接修改函式內的money

    • @laisam9500
      @laisam9500 3 ปีที่แล้ว +1

      changeMoney函式 沒有在裡面var 所以會宣告提升 跑到function callMethod() 外面宣告 所以等於是在外面宣告兩個函示

    • @user-mh9gz2mg3m
      @user-mh9gz2mg3m 3 ปีที่แล้ว

      不好意思 承上我想問一下 那若如果有兩個function 都有不帶var字眼的 changeMoney 不就會造成外部全域汙染或是報錯嗎?

    • @laisam9500
      @laisam9500 3 ปีที่แล้ว

      @@user-mh9gz2mg3m 不會啊 你自己想看看 var a=1 在var a=2 js 從上到下執行 第一個 a=1 你要重新宣告一次a=2 所以他會執行的二個你宣告的事件 你可以自己去測試就知道結果了

    • @laisam9500
      @laisam9500 3 ปีที่แล้ว

      @@user-mh9gz2mg3m 所以才需要做閉包 防止被污染 但不會報錯

    • @user-mh9gz2mg3m
      @user-mh9gz2mg3m 3 ปีที่แล้ว

      @@laisam9500 您好,謝謝您的回覆,我的意思是 有兩個callMethod1 跟 2 裡面各有不帶var字的 changeMoney , 而我自己測試過了會變成後的會覆蓋先前的,導致1的changeMoney全域會沒作用 只有2會有, 感謝您的回覆 ^ ^