JavaScript:异步但不是多线程?

问题描述

| 我有以下内容
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不执行多线程。所以这是有争议的。     ,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);
    ,我认为您应该检查您的代码。未定义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);
您将永远不会收到“ hi \”消息。必须先执行所有代码,然后才能执行其他代码! JavaScript也不会暂停执行代码以运行其他代码,然后继续执行第一个代码。对不起,我的解释不好!