1. 程式人生 > >JavaScript, 函數是實現異步的基礎

JavaScript, 函數是實現異步的基礎

com ava 多線程 希望 不知道 arch tps 想想你 而是

昨天一朋友和我聊到JS中的異步和同步, 後來從異步和同步的問題中得出了函數的另一面, 覺得挺不錯, 特此分享一下

====

追夢子: 聊天是同步還是異步

小A: 異步

小A: 和你聊還可以和別人聊

追夢子: 那得看怎麽聊,

小A: 那你也沒法說我錯

追夢子: 你要是等另一個人回答後再回,也就是你一句我一句,那就是同步

小A: 可如果我和你聊著同事也在和別人聊

小A: 就是異步

追夢子: 如果你和對方左一句又一句,不按順序來,那就是異步

追夢子: 我說你錯是因為,你都說是異步

追夢子: 沒有說什麽情況下才是異步

小A: 不是說左一句右一句 不按順序就是異步

小A: 而應該是在你輸入的情況下 我可以去和別人聊天的呀

追夢子: 對,是這個意思

小A: ??

小A: 我說對了

追夢子: 你說的有理,左一句又一句這說的太範了,不算是異步

小A: 嗯

追夢子: 異步就是不去等待

小A: 對

小A: 同步是順序執行 但會堵塞 異步解決的堵塞 但也會改變順序

追夢子: 改變順序是結果產生的,不要把重點放在順序上

小A: 嗯嗯

追夢子: 在等待的過程中,可以去做別的事,才是異步的本質,或者異步的價值所在

小A: 那回調函數你有什麽要說的麽

追夢子: 做完某件事,通知你一下

小A: 並且這件事還得最後做

追夢子: 那不是這樣說

追夢子: 又不是非得最後執行這個回調函數

小A: 是要最後執行啊

追夢子: 回調就是,你事先告訴某人,你說xx你做完件事通知下我,當他做完的時候就會告訴你,但是他在告訴完你以後還可以去做別的

追夢子: 所以不存在最後執行一說

追夢子: 你說最後執行,那你有例子?

小A: 我找找

小A: 你看這個 他事先輸出this will.... 然後執行fn裏的 最後進行回調輸出this

小A: https://www.cnblogs.com/moltboy/archive/2013/04/24/3040213.html

追夢子: 哈哈

追夢子: 你看的是表面

追夢子: 回調函數才沒有什麽先執行後執行

追夢子: 你想什麽時候執行什麽時候執行

追夢子: 都是你自己來決定的

追夢子: 雖然看似回調函數是最後執行,但這只是它的表像

追夢子: 你那個ajax,回調函數後面也可以執行別的啊

追夢子: 回調函數就是個很簡單的東西,不要想復雜了

小A: 我只能看表面

小A: 我就覺得他是最後執行的

追夢子: 把函數作為參數傳入到另一個函數中。這個函數就是所謂的回調函數。

追夢子: 就看他寫的這句就好了

小A: [強]

追夢子: 其他的都是表面

小A: [白眼]

追夢子: 表面的東西,不同的人就會看成不同的東西

追夢子: 就會產生誤解

小A: 好吧

追夢子: 往往他只是說的某一方面,但你卻看成是它的一切

追夢子: 就像回調函數

追夢子: 你昨天和我說回調函數,早上路上時想了下關於函數的

小A: 然後呢

追夢子: 發覺以前沒意識到一件事,函數有個更重要的

追夢子: 那就是可選擇時機

小A: 繼續

追夢子: 如果沒有這點,異步就不太可能實現

小A: 只要稍微什麽一點 我就有點暈 我還是得多看看 多想想

小A: 深入

追夢子: 你想啊。函數是不是可以由你自己決定什麽時候去執行

小A: 當然 調用它就執行了

追夢子: 如果沒有這點,你說異步還可能嗎

追夢子: 如果沒有這一點,所有代碼就被直接執行了, 也就是只能是同步了

小A: 但是 你只是告訴他什麽時候執行 他什麽時候執行完你是不知道的 就異步來說

追夢子: 你沒理解我的點

小A: 我知道你的意思 咱們可以控制他什麽時候去執行 也就實現了異步

追夢子: 這樣說也不對, 函數不等於異步, 我的意思是函數是實現異步的基礎, 如果沒有函數就無法實現異步, 但函數本身並不是異步, 異步的本質是通過多線程來實現的,或者是通過等待時機,以延遲執行來達到目的, 比如JS中的setTimeout, 所以異步不等於函數, 而我說的函數是實現異步的基礎就在於, 如果沒有函數, 而你又希望在做完某件事再去執行某段代碼的話, 那你想想你的代碼要麽是被直接執行了, 要麽是等那件事做完了再去執行另一段代碼, 也就是同步的

====

一直以為函數就是代碼片段的組合, 然而現在想想函數的作用不僅僅是代碼的組合以及重復利用, 另一個目的是可選擇執行的時機, 很難想像沒有函數的JS會是什麽樣的, 我想那將會是另一門語言, 另一種的語法

後來想了下, 我當時在聊天時說: "如果你和對方左一句又一句,不按順序來,那就是異步" 這句其實並沒有錯, 只是沒有表達清楚, 假如你和A兩個人聊天, 你先問A了某個問題, 但你並沒有等A回復, 而是接著又問A了另一個問題, 那就是異步了

JavaScript, 函數是實現異步的基礎