Javascript:为什么我需要在for循环中声明var i = 0?

时间:2015-11-20 07:32:04

标签: javascript

我正在做一个需要递归的问题,用于计算加起来一定金额的硬币组合。有效的解决方案如下。困扰我几个小时的一件事是,当我没有在for循环中声明var i = 0时,它不起作用。据我所知,当我在for循环中声明var时,它会保持在该范围内,就好像我不是它从全局中拉出来一样?有人可以向我解释为什么这个算法在jsfiddle.net上不起作用,除非我在for循环中声明var i = 0。感谢任何可以提供帮助的人。

var coins = [1, 2, 5, 10, 20, 50, 100];
var ways = 0;

function combo(index,amount) {
    //if I write for(i=0;...;i++) it doesn't work 
    for (var i = 0; i <= Math.ceil(amount / coins[index]); i++) {
        amountleft = amount - (i * coins[index]);
        if (amount < 0) {
            break;
        }
        if (amountleft == 0) {
            ways ++;
            break;
        }
        if (amountleft > 0) {
            combo(index + 1,amountleft);
        }
    }
}    


combo(0,50)
console.log(ways)

4 个答案:

答案 0 :(得分:2)

你的假设是正确的。如果省略var,则变量将是全局变量(或抛出错误,具体取决于您的浏览器)。

如果你的函数是递归的,那么当来自堆栈中不同位置的循环正在改变(并且依赖于迭代)相同的变量时,显然会有干扰。

答案 1 :(得分:0)

它的作用域不是for-loop块。有些人把它放在外面。它两种方式都有同样的效果。

var i = 0;
for (; i<foo.length; i++) {
}

在es5中声明变量时,应始终使用var。值得一读的是它的范围(提示:通常是它声明的函数)。在es6中,我们有let,它的范围是它声明的块(在这种情况下是for循环)

答案 2 :(得分:0)

因为在javascript中你必须在你想要使用它之前明确声明你的变量。所以,如果你写

for(i=0;...;i++)

变量i来自何处? Javascript会抛出错误:Uncaught ReferenceError: i is not defined

答案 3 :(得分:0)

是的,当然它不会工作,sql injection是可变的,必须进行初始化。

是的,你可以在外面声明它循环。但我认为你已经在功能之外宣布它不起作用。

   Cursor cur = db.query(dbHelper.TABLENAME, columns, columns[1]+" = ?", new String[]{"ali"}, null, null, null);