JavaScript函数作为For循环中的变量

时间:2013-09-16 11:08:05

标签: javascript for-loop

我只是在玩一些JavaScript并拥有以下代码:

function Stack() {
    // Wrapper class for Array. This class only exposes the push
    // and pop methods from the Array and the length property
    // to mimic the a LIFO Stack.

    // Instantiate new Array object.
    this.stack = new Array();

    // Pushes a new value on to the stack.
    // @param arg to be pushed.
    this.push = function(arg) {
        return this.stack.push(arg);
    }

    // Pops a value from the stack and returns it.
    this.pop = function() {
        return this.stack.pop();
    }

    // Get size of the Stack.
    this.size = function() {
        return this.stack.length;
    }
}

var stack = new Stack();

// Push 10 items on to the stack
for (var i = 0; i < 10; i++) {
    stack.push(i);
}

for (var i = 0; i < stack.size(); i++) {
    console.log(stack.pop());
}

第一部分定义了一个Stack对象,它实际上只是本机Array对象的包装器,但只暴露了一些方法和属性,使其像LIFO堆栈一样。为了测试它,我在底部编写了代码。但是,当我尝试使用stack.size()在for循环中返回堆栈的当前大小时,循环只迭代5次。然而,如果我将该方法调用的返回值赋给变量并将变量传递给for循环,那么它将迭代正确的次数(10)。为什么是这样?我不能在for循环中使用stack.size()吗?

5 个答案:

答案 0 :(得分:1)

当你在循环中使用stack.size()时,循环迭代5次后,stack.size()等于5,因为你已经将堆栈弹出了5次,i也等于5。在下一次迭代中,i大于堆栈的大小,循环最终结束。

答案 1 :(得分:1)

因为for循环中的stack.size()在每次执行后都要进行测试,因此每次从堆栈中弹出一个元素时,大小都会变小。如果你使用变量,你将在该变量中保存堆栈大小,即使从堆栈弹出该变量也不会改变。

答案 2 :(得分:1)

写它的另一种方法是:

for (var i = 0, l = stack.size(); i < l; i++) {
  console.log(stack.pop());
}

for...loops IMO的最好方法。

答案 3 :(得分:0)

对于每次迭代,您将删除其中一个对象,并减少数组1的大小。

答案 4 :(得分:0)

另外,为什么不这样做:

this.pop = this.stack.pop;

而不是

this.pop = function() {
    return this.stack.pop();
}

对我来说似乎是不必要的关闭?