2017-03-10 100 views
-1

一些觀察。某些原生javascript功能被阻止。如警示框。如果瀏覽器允許用戶編寫其他阻止功能,那麼它們不會比打破自己的頁面更惡意。所以我不認爲這是一個安全問題。爲什麼Javascript函數不能阻塞?

啓用阻塞功能可能會導致不良的設計模式。也許這個目標僅僅是爲了阻止草率的設計,因爲JavaScript絕對是異步的。但這是一種相當自以爲是的設計理念,可以融入語言本身。

問題: 是否有任何歷史或技術原因,爲什麼它不可能建立另一個功能?或者相反,我誤解了,有沒有辦法讓其他函數阻塞?

建議的設計模式。我認爲值得展示我的意思是一個阻塞函數。正常的設計模式是做:

doSomethingThatMayTakeTime(); 
function doSomethingThatMayTakeTime(){ 
    //Something that takes time 
    callback(); 
} 

function callback(){ 
    //Do something you only want to do once the first function is complete 
} 

但也有我的代碼很多地方有沒有可能的代碼,我想直到doSomethingThatMayTakeTime函數執行被執行。在這種使用情況下,爲什麼我們可以說:

doSomethingThatMayTakeTime(); 
//NextLineOfCode 

function doSomethingThatMayTakeTime(){ 
    // Blocking Code -- Prevent execution of any code outside this function until this function returns/executes its last line 
    //Something that takes time 
} 

正如你可以在這個特定的使用情況下看到一個不會是瘋了思考,這是一個更簡潔的方法。雖然這看起來很具體,但我經常遇到這種情況。使用其他模式框替換警告框時會出現一個簡單的示例。

+0

我想說的是,爲環境而設計的javascript幾乎總是可以執行的其他功能,即UI操作的事件處理程序。 – mrmcgreg

+2

「我想要執行的代碼不存在」。你的代碼 - 也許。但瀏覽器同時運行了很多其他的JS。你的代碼__玩得很好。 –

+2

[我可以在這裏詢問什麼主題?](https://stackoverflow.com/help/on-topic):「_但如果您的問題通常涵蓋**特定的編程問題**,或軟件算法或軟件工具通常使用的工具;是一個實用的,可回答的問題,它是軟件開發所特有的,然後你是在正確的地方提問你的問題!「) – Andreas

回答

1

有沒有辦法讓其他功能阻塞?

功能本身,所有他們都阻止。放入一個無限循環並觀察瀏覽器掛起。

這是異步的I/O。不要混淆兩者。

+0

我不確定我關注。你能否詳細說明一下。 – COMisHARD

+0

I/O,輸入/輸出 - 訪問外部資源。做一個Ajax調用,下載文件,類似的東西。在node.js中,這還包括數據庫訪問,讀取文件等。 –

0

當你運行一個阻塞函數時,它不僅僅是你被阻塞的頁面上的代碼。它是整個JavaScript引擎的主線程。如果用戶點擊一個按鈕,嘗試輸入一個輸入字段,滾動頁面或執行任何生成JS引擎應該處理的事件的事件,在阻塞函數返回之前什麼都不會發生。

這是一件壞事。對用戶來說,它與瀏覽器崩潰沒有區別。

請注意,警報框不會以相同的方式阻塞。是的,主事件處理線程被阻塞,但不是所有的事件處理。該對話框接管所有事件處理並以響應方式處理它。這樣想一想:彈出一個提示暫時改變什麼被認爲是一個事件;它根本不會阻止事件。

你說,「JavaScript絕對是異步」。我不知道你是什麼意思,但作爲一個整體陳述,這決不是真的。 (例如,請參閱this thread。)您需要特別努力創建異步活動。有關更多信息,請參閱this documentation

1

你的意思是這樣的嗎?

$('#blocking').click(function() { 
 
    var d= new Date().getTime(); 
 
    while(new Date().getTime() - d < 10000) { 
 
    var a=1; 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button id="blocking">Block this tab for 10 seconds</button>
:,做了很長一段時間將凍結您的瀏覽器(沒有事件處理,直到它完成),我覺得你不理解JavaScript的單線程behavio(U)R任何的任何功能

相關問題