元気にやっていますか?
私は相変わらず、曖昧な空白とともにふらふらする毎日です。
健体壮美なあなたのことだから大丈夫だとは思いますが、
くれぐれもお体にはお気をつけください。

2009/12/13

[JavaScript]変数の宣言:varの意味

<Answer>
varを使って宣言するとローカル変数、varを使わないとグローバル変数になる。

JavaScriptでは単純に「変数名 = 値」と宣言することもできるし、varというキーワードを使って「var 変数名 = 値」と宣言することもできる。
今まで単純なサブミットの関数くらいしか書いたことがなかったので、あまり意識したことがなかったが、
先日初めてオブジェクト指向やクロージャの概念を利用して本格的なJavaScriptコードを書いていてその重要性に思い当たった。

きっかけは再起処理をする関数を書いていたときのこと。
function reflexive(obj) {
    // 引数オブジェクトの子要素
    children = obj.childNodes
    
    for(k = 0; k < children.length; k++) {
        if(children[k].childNodes.length > 0) {
            // 子要素があるなら再帰呼び出し
            reflexive(children[k])
        } else {
            // なんらかの処理
            ・・・
        }
    }
}
引数のオブジェクトのすべての子要素に対して、なんらかの処理を実行する関数の例だが、これだと再帰処理がうまく動作しない。
"children"と"k"がグローバル変数になっているからだ。
・"children"がグローバル変数
⇒呼び出し元の"children"が上書きされてしまう。
・"k"がグローバル変数
⇒呼び出し先でも呼び出し元でも同じ変数"k"がインクリメントされ続ける。
"children"と"k"にvarを付けて宣言すれば、ちゃんと動作する。

その他、JavaScriptではブロック変数が定義できないので注意が必要だ。

参考サイト:
Javaスクリプト「変数」メモ(Hishidama's JavaScript-Variable Memo)

0 件のコメント:

コメントを投稿