2017-03-10 5 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 
} 

あなたは、この特定のユースケースで見ることができるように1は、これはクリーンなアプローチで考えるために狂気ではないでしょう。これは具体的に見えるかもしれませんが、私はこの種の状況を比較的頻繁に巡っています。アラートボックスを他のモーダルボックスに置き換えると、簡単な例が1つあります。

+0

私は環境のために、javascriptはほとんど常に実行可能な他の機能、つまりUIアクションのイベントハンドラがあるように設計されていると思います。 – mrmcgreg

+2

"実行したいコードがありません"。あなたのコード - おそらく。しかし、ブラウザは同時に多くのJSを実行します。 __あなたのコードは素晴らしい再生する__has__。 –

+2

[ここではどのような話題を聞くことができますか?](https://stackoverflow.com/help/on-topic): "しかし、質問には一般的に特定のプログラミング問題**、またはソフトウェアアルゴリズム、またはソフトウェア";;);) – Andreas

答えて

1

他の機能をブロックする方法はありますか?

機能自体、すべてがブロックされています。無限ループを入れ、ブラウザがハングするのを観察してください。

これは非同期のI/Oです。 2つを混同しないでください。

+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>
:長い時間のために何もしないすべての関数は(それが完了するまでは、イベント処理ません)ブラウザを凍結する、私はあなたがシングルスレッドbehavio(U)のJavascriptのRを理解していないと思います

関連する問題