【问题标题】:Why does this cause an infinite while loop?为什么这会导致无限的while循环?
【发布时间】:2014-05-06 20:46:39
【问题描述】:

我对编码完全陌生,最近开始学习 JavaScript。我不明白为什么下面的代码会导致无限循环。为什么birthday(myAge)函数不能在循环内使条件(myAge < 23)为假?

var myAge = 22
var birthday = function(myAge){
    return(myAge + 1);
}

while (myAge < 23){
    console.log("You're only 22");
    birthday(myAge)
}

【问题讨论】:

    标签: javascript while-loop infinite-loop


    【解决方案1】:

    因为您没有以任何方式修改myAge。您的函数只是返回myAge + 1

    尝试将返回值分配回myAge

    while (myAge < 23){
        console.log("You're only 22");
        myAge = birthday(myAge);
    }
    

    或者,如果你去掉函数参数,那么函数内的名称myAge将引用全局变量,你可以直接修改它:

    var myAge = 22
    var birthday = function(){
        return (myAge = myAge + 1); 
        // or return myAge += 1;
        // or return ++myAge;
    }
    
    while (myAge < 23){
        console.log("You're only 22");
        birthday();        // note, no need to pass any parameters
    }
    

    【讨论】:

    • 嗨,谢谢,这是有道理的。但我不明白为什么'生日'函数没有将值赋回'myAge'?
    • @JosephByrne 有几个原因。 1) myAge + 1 不分配任何值。它获取当前值并返回该值+1。2)函数参数与全局变量不同,因此仅修改参数不会有任何效果。
    • 好的。有没有办法编写一个真正修改变量值的函数?还是我只是误解了函数的用途?
    • 感谢您的耐心等待,我知道这是非常基本的东西!
    • @JosephByrne 查看我的更新答案以获取替代方案
    【解决方案2】:

    您需要以某种方式增加 myAge,否则您将永远 22 岁……尽管这并不是一件坏事。我想你发现了青春之泉。

    return (myAge += 1)
    

    【讨论】:

    • 把它放在函数里面只会修改局部变量(参数值),不会修改全局变量。
    • myAge 已经是一个全局变量,并且没有绑定到函数范围。
    • 再看一遍。在 OP 的代码中,也有一个名为 myAge 的参数。所以myAge += 1 只会修改那个参数的值。您要么必须在函数外部将返回值分配回 myAge,要么删除参数,以便将 myAge 绑定到全局变量。
    • 正确,我的疏忽
    猜你喜欢
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    相关资源
    最近更新 更多