[英]JavaScript: asynchronous but not multithread?
我有以下內容:
function NumberFormatter(){
...
function helper(){
...
var tempvar;
...
}
function format(num){
...
helper()
...
}
}
//there is a single instance of FT
var FT = new NumberFormatter()
FT.format(123)
對象的狀態不會改變。
在多線程上下文中,如果幾乎同時從兩個不同的地方調用format()
,這段代碼是否會失敗?
是否有一種簡單的方法來鎖定對象,或者更好地保存1000個實例?
答案:(總結所有發布在這里......)
不,代碼不會失敗(因為JavaScript中沒有真正的多線程)
無法鎖定對象而您不需要
你可以有一個實例。 無需創建1000個實例
對於那些不相信的人, 證明代碼 :
<script type='text/javascript'>
function get_random_color() {
var letters = '0123456789ABCDEF'.split('');
var color = '#';
for (var i = 0; i < 6; i++ ) {
color += letters[Math.round(Math.random() * 15)];
}
return color;
}
setInterval('document.getElementById("a").style.backgroundColor=get_random_color()', 10)
//*** setInterval() stops when heavy calculations are done ***//
document.getElementById("b").onclick = function(){
for(var i=0;i<10000000; i++){
Math.atan2(Math.round(1000))
}
}
</script>
兩件事情。 首先,您需要擔心並發問題的唯一時間是處理外部資源或更改對象的狀態。 由於調用formatNum
不會改變NumberFormatter
的狀態,因此絕對沒有什么可擔心的。
其次, javascript不做多線程 。 所以這是一個有爭議的問題。
我想你應該檢查你的代碼。 var FT未定義,因為NumberFormatter不返回值。 format()將拋出異常。
對於單個實例,為什么不做這樣的事情:
var FT = new function (){
this.helper = function (x){
}
this.format = function (num){
}
}
FT.format(123);
還有一件事:JavaScript不使用多個線程,也不能同時執行代碼。 JavaScript中的所有代碼都以非常智能的方式排隊。
一個簡單的例子:
setTimeout(function(){
alert("hi");
},0);
while(true);
你永遠不會得到“嗨”的消息。 在執行其他代碼之前,必須先執行所有代碼! JavaScript也不會暫停執行代碼以運行其他代碼,然后恢復第一個代碼。 對不起我的錯誤解釋!
JavaScript是一種異步語言,始終在單個線程上運行。 Douglas Crockford有一個很棒的JavaScript同步幻燈片:
http://www.slideshare.net/douglascrockford/crockford-on-javascript-scene-6-loopage
由於JavaScript在單個線程上運行,因此實際上不可能同時調用相同的函數兩次。 你的代碼應該沒問題。
此外,如果您想要一個函數來幫助您格式化,那么如何返回具有公共和私有方法的對象? 這將有助於您更接近Singleton模式:
var NumberFormatter = (function() {
// this method is private
var helper = function(x) {
};
// all methods in here are public
return {
format: function(num) {
helper();
}
};
})();
var FT = NumberFormatter.format(123);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.