簡體   English   中英

JavaScript:異步但不是多線程?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM