我可以在 JavaScript 中的不同 for 循环中声明相同的变量两次吗?[复制]

Can I declare the same variable twice in different for loops in JavaScript? [duplicate]

提问人:Uri 提问时间:12/23/2012 最后编辑:CommunityUri 更新时间:3/5/2020 访问量:7485

问:

这个问题在这里已经有答案了:
10年前关闭。

可能的重复项:
JavaScript 变量范围

我有一个用于 HTML 选择选项的 JavaScript 函数,已经有几天了:

// Show and hide days according to the selected year and month.
function show_and_hide_days(fp_form) {
    var select_year= $(fp_form).find("select.value_year");
    var select_month= $(fp_form).find("select.value_month");
    var select_day= $(fp_form).find("select.value_day");
    var selected_year= $.parse_int($(select_year).val());
    var selected_month= $.parse_int($(select_month).val());
    var selected_day= $.parse_int($(select_day).val());
    var days_in_month= new Date(selected_year, selected_month, 0).getDate();
    // If the number of days in the selected month is less than 28, change it to 31.
    if (!(days_in_month >= 28))
    {
        days_in_month= 31;
    }
    // If the selected day is bigger than the number of days in the selected month, reduce it to the last day in this month.
    if (selected_day > days_in_month)
    {
        selected_day= days_in_month;
    }
    // Remove days 29 to 31, then append days 29 to days_in_month.
    for (var day= 31; day >= 29; day--)
    {
        $(select_day).find("option[value='" + day + "']").remove();
    }
    for (var day= 29; day <= days_in_month; day++)
    {
        $(select_day).append("<option value=\"" + day + "\">" + day + "</option>");
    }
    // Restore the selected day.
    $(select_day).val(selected_day);
}

我的问题是 - 我可以在两个不同的 for 循环中声明两次“var day”吗,这个变量的范围是什么?它是否合法,如果我在同一函数中两次声明相同的变量会发生什么?(在 for 循环内部还是在 for 循环外部)?例如,如果我再次使用“var”声明其中一个变量,会发生什么情况?

如果我在变量 day in for 循环之前根本不使用“var”,会发生什么?

谢谢 URI。

P.S. $.parse_int 是一个 jQuery 插件,如果未指定,它会调用基数为 10 的 parseInt。

JavaScript 变量 var declare

评论

2赞 Mr Lister 12/23/2012
您可以自己测试。试试看看会发生什么!

答:

5赞 phant0m 12/23/2012 #1

不,你不应该。声明的变量 using 具有函数作用域,而不是块作用域!var

重新声明变量 using 可能会表明该变量是循环/块的本地变量,但事实并非如此。var

但是,您可以使用声明变量,以确保它是块范围的。let

for (let x = 1; x <= 3; x++) {
   console.log(x)
}
    
for (let w = 65, x = String.fromCharCode(w); w <= 67; w++, x = String.fromCharCode(w)){
    console.log(x)
}

console.log(typeof x) // undefined

29赞 Quentin 12/23/2012 #2

在函数中的任何使用都将限定为该函数。这并不重要,因为声明被提升了。var foofoovar

在同一函数中的其他用法在语法上是合法的,但不会产生任何影响,因为变量的范围已经限定为该函数。var foo

由于它没有效果,有一种思想流派建议反对它(并赞成在函数的最顶端使用单个函数来执行所有范围),以避免暗示它具有重要意义(对于对 JavaScript 的这一特性不完全满意的维护者)。JSLint 将提醒您注意此用法。var