素材牛VIP会员
关于setTimeout()第一个参数很奇怪的地方?
 ji***ca  分类:JavaScript  人气:992  回帖:6  发布于6年前 收藏
var num = 0;
var max = 10;
(function incrementNumber(){
    num++;
    if (num <= max) {
        console.log(num);
        setTimeout(incrementNumber,500)
        //setTimeout(incrementNumber(),500)
    }
    else{
        console.log('done');
    }
})();

谢谢各位,问题已解决: incrementNumber()直接调用函数,返回undefined,导致setTimeout失效,但是incrementNumber()函数仍然运行,所以最后直接输出,但是没有任何时间间隔

当incrementNumber没有带括号的时候,运行正确,每隔500ms从1输出到10.
为什么加上了括号之后incrementNumber(),运行后直接就把1到10输出来了,没有任何的间隔时间?

我知道第一个参数应该是字符串或者函数(名),但为什么这里加上括号之后没有出错呢?(虽然运行结果并不符合预期)
我的理解是最后一次性返回所有数字没有问题,但之前应该会有10*500ms总的等待时间?

讨论这个帖子(6)垃圾回帖将一律封号处理……

Lv6 码匠
許***愿 Linux系统工程师 6年前#1

没问题啊,你把函数执行的返回值(undefined)作为第一个参数,没有问题啊(除了达不到预期结果)。

Lv5 码农
风***飞 CEO 6年前#2

incrementNumber()执行后没有返回值,相当于你在setTimeout中传一个空串呗,也不会报错啊。但是incrementNumber方法还是执行了的,而且是立即执行了,没有延迟。

Lv7 码师
Sl***rk 软件测试工程师 6年前#3

setTimeout延时执行,应该是指将这个加入到队列中,而加入队列是js解析到setTimeout就执行的,并非setTimeout的第二个函数即传入的时间,那个时间是指到那个时间执行传入setTimeout的函数。所以你如果第一个参数加括号,在加队列的时候会直接把incrementNumber()这个加入到队列,而incrementNumber()就直接执行函数了,所以加括号的时候incrementNumber不会有时间间隔。

Lv5 码农
简***兽 Web前端工程师 6年前#4

()是函数调用,不加()是函数引用。

Lv5 码农
躺***上 技术总监 6年前#5

俩个结果是相同的吧 这个 在函数外部包裹小括号然后加小括号 属于立即调用的意思
而结果都应该是1 2 3 500ms依次输出 然后done

你程序这样肯定是没法观察具体的情况 属于一次性执行完毕

你在控制台把加小括号和没加输出一下 进行对比就知道了

Lv6 码匠
天***月 职业无 6年前#6

加括号了就是调用该函数的意思,一个函数名相当于指针,不加括号就是改函数的引用

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取