动态改变循环方向

dop*_*man 6 javascript loops

我正在尝试为两个整数之间的“接近”行为提出一种算法。基本上,给定两个整数ab,我想a“接近” b,即使b小于a. 我认为这应该看起来是循环增量函数的交换:

for (var i = a; approachCond(i, a, b); approachDir(i,a, b)) {
   // some fn(a, b);
}
Run Code Online (Sandbox Code Playgroud)

在哪里

approachCond(i, a, b) {
 return a < b ? i < b :  i > b;
}
Run Code Online (Sandbox Code Playgroud)

approachDir(i, a, b) {
 return a < b ? i++ : i--
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试这样做时,浏览器会冻结(Chrome)。有谁知道如何动态改变循环的方向?

Bar*_*mar 1

问题出在approachDir. i++i--自增和自减。这意味着他们在返回原始值更新变量。因此该函数返回原始值,而不是更新后的值。要在返回之前更新变量,您应该使用or 。++i--i

但是您根本不需要使用增量运算符,因为局部变量将立即消失。只需返回新值即可。

function approachDir(i, a, b) {
    return a < b ? i + 1 : i - 1;
}
Run Code Online (Sandbox Code Playgroud)

您还需要在循环中重新分配变量:

for (var i = a; approachCond(i, a, b); i = approachDir(i, a, b)) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

在编写代码的方式中,您假设变量是按引用传递的,而不是按值传递的,因此函数中的增量将修改调用者的变量。