我想点击一个按钮,在点击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的东西?如果是这样,那么解决方法是什么?
答案 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。文档: