關於lazyman你還應該知道這幾件事

2021-09-17 02:21:10 字數 2180 閱讀 6641

lazyman(「hank」)

//hi! this is hank!

lazyman(「hank」).sleep(10).eat(「dinner」)

// hi! this is hank!

// 等待10秒..

// wake up after 10

// eat dinner~

lazyman(「hank」).eat(「dinner」).eat(「supper」)

// hi this is hank!

// eat dinner~

// eat supper~

lazyman(「hank」).sleepfirst(5).eat(「supper」)

// 等待5秒

// wake up after 5

// hi this is hank!

// eat supper

這道題考察的肯定不是實現這個函式的能力問題,應該是流程控制的問題。解決思路應該是將所有的人如都存放到乙個陣列中,並在所有的方法執行完之後一次性的輸出,實現的**如下:

function _lazyman(name) 

})(name);

this.tasks.push(fn);

settimeout(function(), 0); // 在下乙個事件迴圈啟動任務

}/* 事件排程函式 */

_lazyman.prototype.next = function()

_lazyman.prototype.eat = function(name)

})(name);

this.tasks.push(fn);

return this; // 實現鏈式呼叫

}_lazyman.prototype.sleep = function(time) , time * 1000);

}})(time);

this.tasks.push(fn);

return this;

}_lazyman.prototype.sleepfirst = function(time) , time * 1000);

}})(time);

this.tasks.unshift(fn);

return this;

}/* 封裝 */

function lazyman(name)

我自己在思考解決方法的時候最讓我困惑的就是如果判斷lazyman物件的方法被呼叫結束了?我甚至為了這個問題坐過了站。。。後來當我看到這段**的時候,發現乙個簡單的settimeout就解決了這個問題,為什麼呢???

這張圖是mdn對event loop的解釋,這張圖上分為三個部分,分別是佇列、棧、和堆。我們在理解lazyman的過程中需要知道的就是佇列和棧。首先我們來講這個棧:

在js中,每當有函式被執行的時候都會在當前的執行堆疊中建立乙個新的堆疊幀,並放到棧頂。這個堆疊幀中包含當前執行的函式的引數和區域性變數。(有沒有感覺很熟悉,沒錯,這就是我們理解作用域鏈的時候的那個棧)而當我們的函式執行完之後,這個堆疊幀就會從當前棧中移除。

佇列就是js中用來處理非同步事件的佇列,每當有新的非同步事件發生,就會新增乙個新的訊息到佇列的尾部。當之前提到的棧為空時,js就會來處理佇列中的訊息。

舉個例子來說就是:

var a = function() ,0)

}var b = function()

// 2

// 1

這裡需要注意的有

就算你不在函式中使用settimeout,而是在全域性環境中使用,settimeout也是在正常的同步**執行完之後執行,這是因為還有宿主環境在。

settimeout是經過一段時間之後直接向佇列中加入乙個訊息,而普通的http請求是等到有返回結果了才會將訊息加入到佇列中。

普通的非同步事件如果沒有事件***的話是不會操作佇列的,訊息是直接被忽視掉。

lazyman中的`settimeout不是單單的在函式中執行,而是在物件鏈式呼叫中執行。因為是鏈式呼叫,所以**一直在同乙個作用於中執行,也就是說當前的堆疊幀一直沒有被移出棧。上面的**中就是利用了這個特點解決了如何判斷物件呼叫結束的問題。

ip conntrack還應該做更多

ip conntrack將無狀態的在高層有聯絡的單個ip資料報用狀態聯絡了起來,實際上是在更底層破壞了分組交換網的單分組 的原則。ip conntrack基於五元組來追蹤乙個流,在流的開頭或者涉及到狀態切換的時候設定一些狀態和cache,屬於同一流的後續分組就可以共享這些狀態和cache,這些狀態和...

ip conntrack還應該做更多

ip conntrack將無狀態的在高層有聯絡的單個ip資料報用狀態聯絡了起來,實際上是在更底層破壞了分組交換網的單分組 的原則。ip conntrack基於五元組來追蹤乙個流,在流的開頭或者涉及到狀態切換的時候設定一些狀態和cache,屬於同一流的後續分組就可以共享這些狀態和cache,這些狀態和...

穆里尼奧,你是否還應該繼續留在國公尺?

在穆里尼奧從切爾西下課的時候,曾經在部落格中寫過一篇隨筆 穆里尼奧會成為國公尺主帥嗎?不知是不幸還是幸運,正如我所說的,穆里尼奧成為了國公尺的主帥,但是卻沒有帶來我預期中的幸福。在前面的隨筆中,我曾經認為 從技戰術層面講,穆里尼奧的風格也許和國際公尺蘭的現有球員不一致 但從精神層面來講,穆里尼奧絕對...