仍然有点新的JavaScript,所以这可能是一个简单的修复,但任何人都可以告诉我为什么以下代码不起作用? 我正在尝试创建一个可重用的函数,它将以countBy为增量从count增加到countTo。我想改变这些增量(所有均匀,所有赔率,只能被5整除的数字等)。现在它只是打印-10而不是循环。此外,它不知道计数存在,除非我使它全球化,我不知道为什么。 提前谢谢!
编辑:初始化计数,计数= 0,现在可以正常工作。我仍然不确定为什么它不仅仅是在我将其作为参数传递时才识别count的值。它们不一样“数”吗?
//count = incrementing variable
//countTo = final result
//countBy = how we should increment count
var count;
function looping(count, countTo, countBy) {
while(count <= countTo) {
console.log(count);
count = countBy(count);
}
}
console.log("-10 to 19");
var counting1 = looping(-10, 19, function () {
return count++;
});
答案 0 :(得分:0)
由于此问题标有functional-programming
,我将使用功能技巧回答。
你出错的地方
var count;
function looping(count, countTo, countBy) {
// because you named a parameter `count`, you shadowed the external `count` variable
while(count <= countTo) {
console.log(count);
// this doesn't reassign outer count
// instead it reassigns local count and is discarded after function exits
count = countBy(count);
}
}
功能性编程建议反对这样的事情 - 在某些语言中,它是完全不可能做到的。不鼓励外部状态,可变重新分配通常是问题的指标。我们首先调整代码 的工作方式
var count; // no need for external state
var counting1 = looping(-10, 19, function (count) { // use local parameter
return count++; // ++ is a mutating function
return count + 1
});
我们不会依赖外部状态count
,而是将count
传递给每个循环的函数。而不是使用count++
,虽然它可以在JavaScript中工作,因为数字已经是不可变的,但是养成使用非变异函数的习惯会更好。此外count + 1
明确表示此处不需要变异,如果我们想要计算两次,则count + 2
之类的东西会起作用 - 或count * 2
如果我们想每次都将计数器加倍,等
要做到这一点,实际上很容易。下面是一个递归函数,它继续循环,直到from
大于to
。每个循环都会将当前计数器值发送到回调函数f
,该回调函数将返回计数器的下一个值。
function looping (from, to, f) {
if (from > to)
return from
else
return looping (f (from), to, f)
}
looping (-3, 3, function (count) {
console.log (count)
return count + 1 // count by 1
})
// -3, -2, -1, 0, 1, 2, 3
// => 3
looping (-3, 3, function (count) {
console.log (count)
return count + 2 // count by 2
})
// -3, -1, 1, 3
// => 3
&#13;
使用while
- 循环并没有错,但将{em>本地化的任何可变状态保存到looping
函数非常重要。这里重要的一点是,我们函数的用法看起来完全一样,即使实现发生了变化,仍然没有副作用。
function looping (from, to, f) {
while (from < to) from = f (from)
return from
}
looping (-3, 3, function (count) {
console.log (count)
return count + 1 // count by 1
})
// -3, -2, -1, 0, 1, 2, 3
// => 3
looping (-3, 3, function (count) {
console.log (count)
return count + 2 // count by 2
})
// -3, -1, 1, 3
// => 3
&#13;
答案 1 :(得分:-1)
count
在您递增时没有值,因此它变为NaN
。
答案 2 :(得分:-1)
通过使用不正确的内联函数调用,您正在构建一个简单的函数复合体。如果问题是如何获得此功能,这是一个简单的解决方案。
function looping(count, countTo, countBy) {
while(count <= countTo) {
console.log(count);
count += countBy;
}
}
console.log("-10 to 19");
var step = 2;
var counting1 = looping(-10, 19, step);