为什么`setTimeout`不能正常工作?

时间:2016-01-07 23:08:18

标签: javascript jquery

我想点击一个按钮,在点击5秒后触发一个功能,除非再次点击它,在这种情况下计数器重新启动。

var timeoutId;

function dummyFunction(this){
  console.log(this);
  console.log('FIRING');
}

$(function(){
        $('#some-button').click(function(){
            clearTimeout(timeoutId);
            timeoutId = setTimeout( 
                dummyFunction(this), 
                5000
            );
        });
});

但是,当我点击#some-button时,dummyFunction()会立即触发,而不会在五秒后触发。

为什么这样做?它是一个jQuery的东西?如果是这样,那么解决方法是什么?

2 个答案:

答案 0 :(得分:5)

您正在运行您的函数,而不是将其作为参数传递。

试试这个:

foreach ($insta_array['entry_data']['PostPage'][0]['media']['comments']['nodes'] as $comment) {
    echo $comment['text']; // Or add to array, eg. $comments[] = $comment['text'];
}

注意:如果您想将timeoutId = setTimeout( dummyFunction.bind(this), 5000 ); 作为实际参数传递,请使用:this

答案 1 :(得分:0)

要准确匹配您在问题代码中展示的内容,请执行以下操作:

var self = this;

setTimeout(function(){
    dummyFunction.apply(null, self);
}, 5000);

匿名函数(function(){})创建一个单独的新范围,但在声明self的范围内,然后在调用dummyFunction()时,self将作为第一个论点。

请注意,null表示您将其设置为的函数中的上下文的this参数;当您将null传递给Function.prototype.apply()作为第一个参数时,window会获得this

以下是调用函数和设置函数的三种方法的示例:

function dummyFunction(self){
    console.log(self, this);
}

function abc(){
    var self = this;

    this.bind = function(){
        setTimeout(dummyFunction.bind(this, this), 1000);
    }
    this.apply = function(){
        setTimeout(function(){
            dummyFunction.apply(null, self);
        }, 2000);
    }
    this.call = function(){
        setTimeout(function(){
            dummyFunction.call(null, self);
        }, 3000);
    }
}

var a = new abc();

console.log('bind'), a.bind();
console.log('apply'), a.apply();
console.log('call'), a.call();

https://jsfiddle.net/qwb5fxr7/3

我创建了一个对象(abc)来获取自定义上下文。您使用/需要哪一项取决于您希望在您调用的函数中使用this的方式:

  • 如果要将.call()作为参数传递,请使用.apply()this,唯一的区别是参数的传递方式。为此,不得在函数定义中使用this作为参数名称。此外,.call().apply()实际上调用函数,因此您必须将其包装在匿名函数中,并将this作为变量传递给您&#39 ; ve存储在父范围内。
  • 但是,你想要的是.bind(),因为它创建了一个 new 函数,并在附加了上下文的情况下将其传递回来。这意味着您在以后实际调用时不会丢失this(基本上,.bind()会返回可以调用的内容,而.apply().call()立即调用函数)。 EvilZebra的答案显示了如何执行此操作(以及我的答案中的abc.bind()功能)。请参阅setTimeout() examples in the docs

文档: