31

重複の可能性:
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);
}

私の質問は、「var day」を2つの異なるforループで2回宣言できますか?この変数のスコープは何ですか?それは合法ですか?同じ関数で同じ変数を2回宣言するとどうなりますか?(forループの内側またはループの外側)?たとえば、変数の1つを「var」で再度宣言するとどうなりますか?

forループの変数dayの前に「var」をまったく使用しないとどうなりますか?

ありがとう、ウリ。

PS $ .parse_intは、指定されていない場合、基数10でparseIntを呼び出すjQueryプラグインです。

4

2 に答える 2

29

関数での使用はvar foo、その関数を対象fooとします。var宣言が引き上げられるときに、これが関数のどこで行われるかは問題ではありません。

同じ関数での追加の使用var fooは構文的には有効ですが、変数はすでにその関数にスコープされているため、効果はありません。

それは効果がないので、(そしてvarすべてのスコーピングを実行するために関数の最上部にある単一の関数を支持して)それに反対することを推奨する考え方があります。 JavaScriptのこの機能に完全に満足しているわけではありません)。JSLintはこの使用法を警告します。

于 2012-12-23T10:15:31.957 に答える
5

いいえ、すべきではありません。を使用して宣言された変数には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

于 2012-12-23T10:15:18.380 に答える