Javascript 将参数与setInterval一起使用会将其反转

Javascript 将参数与setInterval一起使用会将其反转,javascript,jquery,Javascript,Jquery,我一生都无法理解这里发生了什么。我试图在setInterval中使用function.bind来传递一些变量。发生的情况是,只传递了一个参数,它正在替换第一个参数。我想可能是我误用了bind,或者是。bind与jquery的。bind冲突?在这一点上我一无所知 请打开控制台,查看单击div时发生的情况 多谢各位 我相信Bind不像你想的那样工作。Bind用于将此注入到执行上下文中。如果不关心此问题,则不允许传递参数。为了传递参数,您需要使用这样的匿名函数 var-testA,testB; c

我一生都无法理解这里发生了什么。我试图在setInterval中使用function.bind来传递一些变量。发生的情况是,只传递了一个参数,它正在替换第一个参数。我想可能是我误用了bind,或者是。bind与jquery的。bind冲突?在这一点上我一无所知

请打开控制台,查看单击div时发生的情况

多谢各位


我相信Bind不像你想的那样工作。Bind用于将
注入到执行上下文中。如果
不关心此问题,则不允许传递参数。为了传递参数,您需要使用这样的匿名函数

var-testA,testB;
console.log=function(arg){$(“#console”).html(arg)}//仅用于演示代码段
函数myFunc(testA,testB){
log(“testA是:“+testA+”testB是:“+testB”);
}
myInterval=setInterval(函数(){myFunc(testA,testB);},5000);
$('#myDiv')。单击(函数(){
testA=“foo”;
testB=“bar”;
myFunc(testA,testB);
clearInterval(myInterval);
myInterval=setInterval(函数(){myFunc(testA,testB);},5000);
});

安慰

单击
您将错过
bind
这个
参数,因此您应该编写如下内容:

myInterval = setInterval(myFunc.bind(this, testA, testB), 5000);
可以是任何JS对象。这与函数的
调用
应用
相同


这里是您编辑的fiddle:

this
作为第一个变量传递到setInterval绑定调用中,即
myInterval=setInterval(myFunc.bind(this,testA,testB),5000)避免使用
.bind()
,因为它不向后兼容
setInterval()
接受匿名函数或函数名(如变量)或
.bind()
的结果,我不建议这样做。像这样包装:
setInterval(function(){myFunc(testA,testB)},5000)@PHPglue-这是不正确的。bind工作的原因是它是一个函数句柄,setInterval也接受它。此外,你的例子也行不通。绑定本身不是一个函数调用。它返回一个函数。因此,代码永远不会导致任何事情发生。此外,
.bind(testA,testB)
与OP对
bind
的误解是一样的,你可以从Nicolas或ScottW那里看到关于正确使用它的解释<代码>测试
在您的代码中将成为
上下文,
testB
将被传递到
testA
并且
testB
将接收未定义的代码。老实说,Nicolas Alberts代码可以工作,它在最新的FF上工作,这就是我的客户正在使用的所有代码。:)@tdoakiiii-在这种情况下使用bind没有任何意义,是一种不好的做法,因为它浪费资源。我很想听到关于这个答案不准确的解释。bind()会将这些论点进行咖喱化,并将其冻结,通常不需要额外的anon包装。@dandavis“冻结”
这是一种不正确的表达方式<代码>绑定
在函数绑定的当前执行上下文中替换此
。然而,这是最微创的部分。它还需要手动构建函数对象来进行大量设置。使用“anon包装器”或匿名函数比bind占用的空间小得多。在这里使用bind是过分的,因为当从未使用上下文时,设置新函数对象的所有额外工作都被浪费了。Bind不能消除匿名函数的需要。如果Bind不能消除对anon的需要,为什么接受的答案不使用anon?我也看不出bind()创建的函数对象比anon literal创建的函数对象要重多少…@dandavis-接受的答案只显示了OP的选择,即在调用方法时更正一个简单的语法错误。接受答案并不意味着过程是正确的或最佳实践,但这是一个元问题。也许你应该做一些自我教育,这样你就知道匿名函数和bind创造的东西之间的区别了。如果mozilla手册没有吓倒我,那么我可能会花3秒钟以上的时间来RTFM。。。非常感谢。
myInterval = setInterval(myFunc.bind(this, testA, testB), 5000);