スコープ(レキシカルスコープ・静的スコープ)とローカル変数 : JavaScript

Pocket

ローカル変数のメモ。

ローカル変数

JavaScriptの関数内でvar文で宣言した変数はレキシカルスコープ(静的スコープ)[1]を持つローカル変数になる[2]。JavaScriptには動的スコープはない。

スコープをレキシカルや静的と呼ぶ理由について分かりやすい解説が下記のサイトにある。
»JavaScriptを学ぶ上で避けては通れないレキシカルスコープ

[1] レキシカルスコープと静的スコープを区別せずレキシカルスコープとして扱う。
インスタンスごとに共通の値を持つ変数を静的変数と呼ぶことがあるがその静的とは関係がない。
[2] JavaScriptのローカル変数のスコープはレキシカルスコープのみだがレキシカルスコープを持つローカル変数と動的スコープを持つローカル変数を実装しているプログラム言語もある。Perlではmyでレキシカルスコープを持つ変数、localで動的スコープを持つ変数を宣言する。

スコープ(scope)

レキシカルスコープ(lexical scope) / 静的スコープ(static scope)

レキシカルスコープの大まかな意味を掴むためWikipediaを引用する。
レキシカルスコープ自体の項目はないので静的スコープの説明を引用する(静的スコープ)。

静的スコープ(せいてき- static scope)とは、プログラミング言語におけるスコープの一種。構文構造のみから決定できるため構文スコープ (こうぶん- lexical scope)ともいう。

動的スコープ(dynamic scope)[1]

動的スコープをWikipediaから引用する(動的スコープ)。

動的スコープは、静的スコープ(構文構造のみから決定できるスコープ)に加え、実行時の親子関係の子側(呼び出された側)から親側(呼び出し側)のスコープを参照できるスコープである。このとき参照されるのは、親子関係を親側に辿り、より近いブロックにある変数である。

JavaScriptは変数解決のため外側のスコープを探す(スコープチェーン)。このときの外側のスコープとは関数宣言時のスコープであり実行時のスコープではない。

[1] JavaScriptは動的スコープは実装されていない。

レキシカルスコープのコード

JavaScriptのvar文はレキシカルスコープ。

var x = "global";

var foo = (function () {
    var x = "local"
    return function () {
        return x;
    };
}());

foo(); // 実行結果: local

スコープチェーンで検索されるのは関数宣言時のスコープ。外側のスコープのxの値は関数宣言時のlocal。実行時のglobalではない。

上記コードはクロージャー。クロージャーはレキシカルスコープを利用している。クロージャーについてはWorking with Closures – MDCに詳細な解説がある[1]

[1] 関連記事 : クロージャーのまとめ(1) : JavaScript

動的スコープ

JavaScriptは動的スコープは実装されていない。以下はJavaScriptに関係のないメモ。
» local について – my と local どう違う? – futomi’s CGI Cafe
»my について – my と local どう違う? – futomi’s CGI Cafe
»local について – my と local どう違う? – futomi’s CGI Cafe
を読んでの動的スコープを持つローカル変数のメモ。

  • ローカル変数である。つまりスコープ外からはアクセスできない。
  • グローバル変数と同名の変数名が動的スコープとして定義されるとグローバル変数を上書きする[1]

[1] レキシカルスコープの場合、同名の変数でもグローバル変数とは別に管理され上書きもされない。

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。