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

Posted

技术标签:

【中文标题】我可以在 JavaScript 的不同 for 循环中声明相同的变量两次吗? [复制]【英文标题】:Can I declare the same variable twice in different for loops in JavaScript? [duplicate] 【发布时间】:2012-12-10 05:09:53 【问题描述】:

可能重复:javascript Variable Scope

我有一个用于 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”再次声明其中一个变量会发生什么?

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

谢谢, 乌里。

附: $.parse_int 是一个 jQuery 插件,如果未指定,它会使用基数 10 调用 parseInt。

【问题讨论】:

您可以自己测试。试试看会发生什么! 【参考方案1】:

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

使用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

【讨论】:

【参考方案2】:

在函数中对var foo 的任何使用都会将foo 作用于该函数。当var 声明被提升时,这发生在函数的哪个位置并不重要。

var foo 在同一个函数中的额外使用在语法上是合法的,但由于变量已被限定为该函数,因此不会产生任何影响。

由于它没有效果,因此有一个学派反对它(并赞成在函数的最顶部使用单个 var 函数来执行所有范围界定)以避免暗示存在意义给它(给对 JavaScript 的这个特性并不完全满意的维护者)。 JSLint 会提醒您注意这种用法。

【讨论】:

以上是关于我可以在 JavaScript 的不同 for 循环中声明相同的变量两次吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

for循环子命令中的bash变量扩展[重复]

JavaScript实现循环链表

带有游标参数 (LOOP FETCH) 和 For 循环子查询的 PL/SQL 查询出错

Shell编程进阶篇(完结)

《高性能Javascript》读书笔记-4

javascript中使用循环链表实现约瑟夫环问题