从setTimeout,onclick传参看js函数作为参数

setTimeout传参

我们最先想到是这样:

setTimeout(doSomething1(123),1000);

function doSomething1(content){
    console.log(content);
}

但是这样写,123立马打印出来,并没有等待1s。这是因为,这样写会直接调用doSomething1(123),然后将其返回的结果作为第一个参数运行setTimeout,分解开就是:

var temp = doSomething1(123);
setTimeout(temp,1000);

所以,既然temp是返回值,如果temp是一个函数那就达到我们的目的了,可以这样写:

 ssetTimeout(doSomething1(123),1000);

//这样就可以了
function doSomething2(content){
   return function(){
            console.log(content);
        }
}

onclick传参

和上面道理一样,也是不能直接传参:

var box = document.getElementById("box");
box.addEventListener("click",doSomething1("123"))

function doSomething1(content){
           console.log(content);
       }

修改如下就可以:

var box = document.getElementById("box");
box.addEventListener("click",doSomething2("123"))

function doSomething2(content){
           return function(){
               console.log(content);
           }
       }

这样我们也理解了,为什么box.addEventListener("click",onClick())也不行,而只能是box.addEventListener("click",onClick)了。

然而,修改之后虽然可以传参了,但是返回的是一个匿名函数,也就是说,这个事件监听没有办法取消。所以,还是不要用传参比较好,可以使用全局变量。


总之,函数作为另一个函数的参数时,就要小心:是传入函数对象,而不是函数调用后的结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值