var obj = {
 data : {
 arrs : []
 },
 myset : function(){
 
var that = this;
setTimeout(function(){
  var obj = [];
  obj.push({ 's1': 2021 });
  obj.push({ 's2': 2021 });
  obj.push({ 's3': 2021 });
  that.data.arrs = obj;
},1000);
 
 },
 myget : function(){
 var that = this;
 setTimeout(function(){
   console.log(that.data);
 },500);

 
 }
 
 }
 obj.myset();
 obj.myget();为什么that.data,arr实际上是没有值的, 但是打印还能显示, 但取值就是为空的

解决方案 »

  1.   

    原理和值传递和事件循环有关,你执行到 setTimeout(function(){
       console.log(that.data);
     },500);的时候obj.data.arrs的值还是空数组的地址,后面1秒时间到了就变成新设置的数组,你看的时候已经超过一秒了,所以看见有值,你可以把myset里面的定时器设置久一点比如五秒看看 你就看不见了
      

  2.   

    沙发舒服撒地方你确定?
    即使定时时间为0,你也myget不到obj.arr;即使定时时间为10000,console也会打印出有值的obj.arr,只是等10秒才打印
      

  3.   


              var obj = {
     data : {
     arrs : []
     },
     myset : function(){
     
    var that = this;
    setTimeout(function(){
      var obj = [];
      obj.push({ 's1': 2021 });
      obj.push({ 's2': 2021 });
      obj.push({ 's3': 2021 });
      that.data.arrs = obj;
    },1500);
     
     },
     myget : function(){
     var that = this;
     setTimeout(function(){
       console.log(that.data);
       obj.myset();
     },500);

     
     }
     
     }

     obj.myget();
    我之前遇见的情况是这样的,  整的我一脸懵
      

  4.   

    你确定?
    即使定时时间为0,你也myget不到obj.arr;即使定时时间为10000,console也会打印出有值的obj.arr,只是等10秒才打印打印出that.data的那一刻that.data.arr肯定还是空的,但是控制台保存了that.data的引用,相隔500毫秒后对arr做的设值,控制台自然能看到,如果设置时间久一点,你能看到效果的时间就久一点。这么理解有什么不对么
      

  5.   

    set在get之后执行,所以1秒以后就有三个元素了,console对于对象的打印都是只能看到最后结果,但是你看到的第一行是即时显示的,所以会出现这种情况。举个例子,你添加一个数组,每添加一个元素打印一下length和整个数组,就发现,打印结果每次lenth加一,但是数组都是一样的。(console的这个特性我也觉得很烦,有大神能避免一下吗?)
      

  6.   

    console.log输出一个对象,但是对象的属性直到展开的时候都会获取,如果你打断点,在log之后立即点开查看,此时arr是空的,但等到赋值之后再展开就会获取新的值了:
    执行console.log后展开:执行所有代码后展开: