ขนาดวิดีโอ: 1280 X 720853 X 480640 X 360
แสดงแผงควบคุมโปรแกรมเล่น
เล่นอัตโนมัติ
เล่นใหม่
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 通常是搭配著一起使用的。
我看了好幾遍仍然看不懂,看來我沒有才能QQ
並不是。只是這個方式有它的目的,且與 functional programming有關,詳細請見我在這個影片下的留言:)
不理解也沒關係,閉包遲早會成為歷史的眼淚,ES6的let和const已經解決scope問題了,閉包在ES6起已經毫無用武之地
记忆体是否就是函数表达式呢?老师
不好意思 我想請問一下changeMoney函式不會直接讓money變成全域變數嗎? 為什麼能直接修改函式內的money
changeMoney函式 沒有在裡面var 所以會宣告提升 跑到function callMethod() 外面宣告 所以等於是在外面宣告兩個函示
不好意思 承上我想問一下 那若如果有兩個function 都有不帶var字眼的 changeMoney 不就會造成外部全域汙染或是報錯嗎?
@@user-mh9gz2mg3m 不會啊 你自己想看看 var a=1 在var a=2 js 從上到下執行 第一個 a=1 你要重新宣告一次a=2 所以他會執行的二個你宣告的事件 你可以自己去測試就知道結果了
@@user-mh9gz2mg3m 所以才需要做閉包 防止被污染 但不會報錯
@@laisam9500 您好,謝謝您的回覆,我的意思是 有兩個callMethod1 跟 2 裡面各有不帶var字的 changeMoney , 而我自己測試過了會變成後的會覆蓋先前的,導致1的changeMoney全域會沒作用 只有2會有, 感謝您的回覆 ^ ^
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 通常是搭配著一起使用的。
我看了好幾遍仍然看不懂,看來我沒有才能QQ
並不是。只是這個方式有它的目的,且與 functional programming有關,詳細請見我在這個影片下的留言:)
不理解也沒關係,閉包遲早會成為歷史的眼淚,ES6的let和const已經解決scope問題了,閉包在ES6起已經毫無用武之地
记忆体是否就是函数表达式呢?老师
不好意思 我想請問一下changeMoney函式不會直接讓money變成全域變數嗎? 為什麼能直接修改函式內的money
changeMoney函式 沒有在裡面var 所以會宣告提升 跑到function callMethod() 外面宣告 所以等於是在外面宣告兩個函示
不好意思 承上我想問一下 那若如果有兩個function 都有不帶var字眼的 changeMoney 不就會造成外部全域汙染或是報錯嗎?
@@user-mh9gz2mg3m 不會啊 你自己想看看 var a=1 在var a=2 js 從上到下執行 第一個 a=1 你要重新宣告一次a=2 所以他會執行的二個你宣告的事件 你可以自己去測試就知道結果了
@@user-mh9gz2mg3m 所以才需要做閉包 防止被污染 但不會報錯
@@laisam9500 您好,謝謝您的回覆,我的意思是 有兩個callMethod1 跟 2 裡面各有不帶var字的 changeMoney , 而我自己測試過了會變成後的會覆蓋先前的,導致1的changeMoney全域會沒作用 只有2會有, 感謝您的回覆 ^ ^