Javascript 为什么console.log在它之前记录一个值';谁被指派了?

Javascript 为什么console.log在它之前记录一个值';谁被指派了?,javascript,Javascript,举个简单的例子: self.curTabs = null; $j.getJSON(url) .done(function (response) { self.curTabs = response.tabs; _.each(self.curTabs, function (tab) { tab.dataLoaded = true; }); console.log(self.curTabs);

举个简单的例子:

self.curTabs = null;

$j.getJSON(url)
    .done(function (response) {
        self.curTabs = response.tabs;

        _.each(self.curTabs, function (tab) {
            tab.dataLoaded = true;
        });

        console.log(self.curTabs);
    });
逻辑输出:
[0:Object{dataload:true,etc..},1:etc..]

但在这个例子中:

self.curTabs = null;

$j.getJSON(url)
    .done(function (response) {
        self.curTabs = response.tabs;

        _.each(self.curTabs, function (tab) {
            tab.dataLoaded = true;
        });

        console.log(self.curTabs);

        _.each(self.curTabs, function (tab) {
            tab.dataLoaded = false;
        });
    });
不合逻辑的输出:
[0:Object{dataload:false,etc..},1:etc..]


为什么变量在赋值之前会得到值
false

因为console.log在每个实现中都不同步。这样它就一直排队,直到主线程完成。同时设置新值。

是的,在某些情况下这有点烦人。那么如何调试?在.done()中我调用一个函数,在这个函数中我测试
if(tab.dataLoaded){…}
,预期的结果是
dataLoaded==true
,但测试是KO。您可以改为记录
JSON.stringify(self.curTabs)
。下面是。使用调试器;-)或者使用一些let替换,比如stringify方法或以下方法之一:完全复制