js中函数参数是传值还是传址问题

最近在刷js细节题的时候,经常遇到这么一些题

for(var i=0;i<5;i++){
    setTimeout(function(){
        console.log(i)
    },1000)
}//输出结果是5个5
for(var i=0;i<5;i++){
    (function(i){
        setTimeout(function(){
            console.log(i)
		},1000)
    })(i)
}//输出结果是0 1 2 3 4
for(var i={j:0};i.j<5;i.j++){
    (function(i){
        setTimeout(function(){
            console.log(i.j)
        },1000)
    })(i)
}//输出结果是5个5

为什么有时输出5个5,有时输出0 1 2 3 4呢?

首先我们看第一例子,等主进程执行完后再执行setTimeout中的函数,到主进程执行完后,函数中使用的i仍然是for循环中一开始定义的i,也就是说执行console.log(i)语句时编译器会去拿i的值,这时i的值已经变成了5,所以输出来的是5个5。

再来看第二个例子,同样是等主进程执行完后再执行setTimeout中的函数,但不一样的是,setTimeout外层多了一个自调用函数,for循环中定义的i会先传值给自调用函数中的i,具体看图
在这里插入图片描述

第三个例子,由于js中数组和对象类型作为函数参数时,是传地址而不是传值,自调用函数并没有申请新的内存空间存储i值
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值