Javascript 将值传递给nodejs中的回调
可能重复:Javascript 将值传递给nodejs中的回调,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,可能重复: (i=0;i
(i=0;i<100;i++)的
{
setTimeout(函数(){
控制台日志(i);
}, 500)
}
在上面的代码中,它将只打印100。我知道原因。但是如何将当前i值发送到setTimeout
中的回调?:
(i=0;i)的:
对于(i=0;i这项工作:
for (var i = 0; i < 100; i++) {
(function(i) {
setTimeout(function() {
console.log(i);
}, 500);
})(i);
}
for(变量i=0;i<100;i++){
(职能(一){
setTimeout(函数(){
控制台日志(i);
}, 500);
})(i) );
}
这项工作:
for (var i = 0; i < 100; i++) {
(function(i) {
setTimeout(function() {
console.log(i);
}, 500);
})(i);
}
for(变量i=0;i<100;i++){
(职能(一){
setTimeout(函数(){
控制台日志(i);
}, 500);
})(i) );
}
在循环中使用匿名函数创建闭包:
for (i = 0; i < 100; i++) {
(function(i){
window.setTimeout(function() {
console.log(i);
}, 500)
})(i);
}
(i=0;i<100;i++)的{
(职能(一){
setTimeout(函数(){
控制台日志(i);
}, 500)
})(i) );
}
调用时将值传递给函数时,将复制该值,并且函数的每个实例都有自己的副本,该副本在循环计数器更改时不会更改。在循环内使用匿名函数创建闭包:
for (i = 0; i < 100; i++) {
(function(i){
window.setTimeout(function() {
console.log(i);
}, 500)
})(i);
}
for (i = 0; i < 100; i++) {
setTimeout((function(i) {
return function(){
console.log(i);
}
})(i), 500)
}
(i=0;i<100;i++)的{
(职能(一){
setTimeout(函数(){
控制台日志(i);
}, 500)
})(i) );
}
在调用时将值传递给函数时,将复制该值,并且函数的每个实例都有自己的副本,该副本在循环计数器更改时不会更改。for(i=0;i<100;i++){
for (i = 0; i < 100; i++) {
setTimeout((function(i) {
return function(){
console.log(i);
}
})(i), 500)
}
setTimeout((函数(i){
返回函数(){
控制台日志(i);
}
})(i) ,500)
}
用于(i=0;i<100;i++){
setTimeout((函数(i){
返回函数(){
控制台日志(i);
}
})(i) ,500)
}
bt如果它是某个其他回调(setTimeout就是一个例子)。任何默认情况下已经有一些参数的通用回调。如果不能这样做,请使用旧的闭包解决方案(请参阅所有其他答案)@Guffa这是node.js,而不是IESincesetTimeout
不是ES的一部分,node.js与Mozilla没有任何关系,最好链接到node.js文档:。@dystroy:Right.sleed my member.bt如果是其他回调怎么办。(setTimeout就是一个例子)。默认情况下已具有某些参数的任何通用回调。如果无法执行此操作,请使用旧的闭包解决方案(请参阅所有其他答案)@Guffa这是node.js,不是因为setTimeout不是ES的一部分,node.js与Mozilla无关,最好链接到node.js文档:。@dystroy:对。我忘了。Nit:OP使用的原始回调(函数(){console.log(i);}
)已经是一个闭包了。你基本上是说“使用闭包而不是闭包"。重要的一点是,您正在立即执行该函数,从而创建一个新的作用域。@FelixKling:该捕获捕获捕获循环变量而不是复制它,因此您需要另一个闭包,而不是闭包而不是闭包。好的,您不是这样说的,但对我来说,它听起来像这样。但不,从技术上讲,您不需要另一个闭包,您需要一个新的作用域(在JS中是函数调用)来捕获变量的当前值。正如我所说,这都是吹毛求疵,但仅将立即执行的函数称为“闭包”是不正确的。这不是该构造的主要特征,创建一个新的作用域是。如果JavaScript对闭包使用不同的语法(与PHP一样,与“普通”函数不同的是,区别更加明显。Nit:OP使用的原始回调(function(){console.log(i);}
)已经是一个闭包了。您基本上是说“使用闭包而不是闭包”。重要的一点是,您正在立即执行该函数,从而创建一个新的作用域。@FelixKling:该捕获捕获捕获循环变量而不是复制它,因此您需要另一个闭包,而不是闭包而不是闭包。好的,您不是这样说的,但对我来说,它听起来像这样。但不,从技术上讲,您不需要另一个闭包,您需要一个新的作用域(在JS中是函数调用)来捕获变量的当前值。正如我所说,这都是吹毛求疵,但仅将立即执行的函数称为“闭包”是不正确的。这不是该构造的主要特征,创建一个新的作用域是。如果JavaScript对闭包使用不同的语法(与PHP一样,与“普通”函数不同的是,两者之间的区别将更加明显。