求这个输出结果的原理,

z1696014041 2019-03-07 11:28:47
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实际上是没有值的, 但是打印还能显示, 但取值就是为空的

...全文
128 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
麦草CMS 2019-03-07
  • 打赏
  • 举报
回复
js代码执行机制决定的。没什么高深的。解释其原理需要大篇幅,网上大巴的有关这方面的文章,你百度吧。
Hello World, 2019-03-07
  • 打赏
  • 举报
回复
console.log输出一个对象,但是对象的属性直到展开的时候都会获取,如果你打断点,在log之后立即点开查看,此时arr是空的,但等到赋值之后再展开就会获取新的值了:
执行console.log后展开:

执行所有代码后展开:

_Nana_ 2019-03-07
  • 打赏
  • 举报
回复
set在get之后执行,所以1秒以后就有三个元素了,console对于对象的打印都是只能看到最后结果,但是你看到的第一行是即时显示的,所以会出现这种情况。举个例子,你添加一个数组,每添加一个元素打印一下length和整个数组,就发现,打印结果每次lenth加一,但是数组都是一样的。(console的这个特性我也觉得很烦,有大神能避免一下吗?)
改天换地 2019-03-07
  • 打赏
  • 举报
回复
引用 3 楼 麦草CMS 的回复:
沙发舒服撒地方 [quote=引用 2 楼 改天换地 的回复:] 原理和值传递和事件循环有关,你执行到
setTimeout(function(){
   console.log(that.data);
 },500);
的时候obj.data.arrs的值还是空数组的地址,后面1秒时间到了就变成新设置的数组,你看的时候已经超过一秒了,所以看见有值,你可以把myset里面的定时器设置久一点比如五秒看看 你就看不见了
你确定? 即使定时时间为0,你也myget不到obj.arr;即使定时时间为10000,console也会打印出有值的obj.arr,只是等10秒才打印[/quote]打印出that.data的那一刻that.data.arr肯定还是空的,但是控制台保存了that.data的引用,相隔500毫秒后对arr做的设值,控制台自然能看到,如果设置时间久一点,你能看到效果的时间就久一点。这么理解有什么不对么
z1696014041 2019-03-07
  • 打赏
  • 举报
回复

          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();


我之前遇见的情况是这样的, 整的我一脸懵
麦草CMS 2019-03-07
  • 打赏
  • 举报
回复
沙发舒服撒地方

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

你确定?
即使定时时间为0,你也myget不到obj.arr;即使定时时间为10000,console也会打印出有值的obj.arr,只是等10秒才打印
改天换地 2019-03-07
  • 打赏
  • 举报
回复
原理和值传递和事件循环有关,你执行到
setTimeout(function(){
   console.log(that.data);
 },500);
的时候obj.data.arrs的值还是空数组的地址,后面1秒时间到了就变成新设置的数组,你看的时候已经超过一秒了,所以看见有值,你可以把myset里面的定时器设置久一点比如五秒看看 你就看不见了

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧