【问题标题】:Looping in js using callback / closure / arguments使用回调/闭包/参数在 js 中循环
【发布时间】:2018-02-15 22:08:01
【问题描述】:

我正在从这个帖子中学习 js 闭包:How do JavaScript closures work?

我想尝试一下,所以我尝试通过创建一个在函数本身上使用回调的函数来创建一个循环,这样做我会增加一个参数并显示结果。

起初它不起作用,然后我改变了增加参数的方式,它起作用了:

function test1(i1){
  console.log("test1 : "+i1.toString());
  setTimeout(function(){test1(i1++);},2500);
}

function test2(i2){
  console.log("test2 : "+i2.toString());
  setTimeout(function(){test2(++i2);},2500);
}

test1(0);
test2(0);

只将i++改为++i

输出如下:

test1 : 0 
test2 : 0 
undefined
test1 : 0 
test2 : 1 
test1 : 0 
test2 : 2 
test1 : 0 
test2 : 3 
test1 : 0 
test2 : 4 
test1 : 0 
test2 : 5

为什么第一步不起作用?

编辑 2:我知道 i++ 和 ++i 之间的区别,但它不应该工作吗?。

编辑:肯定与闭包有关...

【问题讨论】:

  • 这与闭包无关,更多与执行顺序有关。不错的编辑:)

标签: javascript callback closures


【解决方案1】:

function test1(i1){
  console.log("test1 : "+i1.toString());
  setTimeout(function(){test1(i1++);},2500);
}

你总是用相同的 i1 值调用 test1(),然后递增它。

因为你总是用值 0 调用它,所以你得到 0 作为输出

test1(i1++)

等价于

test1(i1); // it is always getting called with value = 0
i1++; // later being incremented but not used

在其他函数中

function test2(i2){
  console.log("test2 : "+i2.toString());
  setTimeout(function(){test2(++i2);},2500);
}

相当于

i2 = i2 + 1;
test2(i2);

【讨论】:

  • 为什么它不增加 i1 之前将它传递给 test1。是否在函数启动后进行计算?它是否通过计算而不是计算结果?如果是,为什么它“执行” ++i2(之前?)将它传递给 test2?
  • i1++ 表示,传递i1的当前值,然后在下一步递增,++i2 表示先递增然后传递给函数
  • 好吧,我绝对猜不到^^。谢谢你!
  • 如果您在test1(i1++) 之后调试或添加另一个console.log,您会看到它确实增加到1,只是它在函数执行后执行此操作上面讨论过!
猜你喜欢
  • 2011-10-22
  • 2017-02-06
  • 2021-07-30
  • 2020-12-30
  • 2022-11-26
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多