電子書籍の厳選無料作品が豊富!

静的スコープは、関数内関数で宣言した変数を関数内関数の外で参照できないが、その外にある変数を関数内関数で参照することをいい、スコープチェーンが、その関数内関数から外側のブロックに向かって、変数を探していく仕組みのことを指すと認識しております。
プロトタイプチェーンのように、目的の値が見つかれば、外側に同名の値が存在した場合でもそれ以上遡ることはしません。
また、関数内関数から外にある変数を参照する仕組みをクロージャーと呼びます。

ところでこの静的スコープとスコープチェーンの違いって何なのでしょうか。どちらも外側にある変数を参照しようとすることを指す言葉で、
違いが読み取れませんでした。

質問者からの補足コメント

  • ご回答有難うございます。
    スコープは、変数や関数に付ける名前の有効範囲(グローバル内{window}で宣言すればグローバル変数或いはオブジェクト、ローカルで宣言すれば環境(Call)オブジェクトのプロパティ)だと思っておったのですが、オブジェクトを参照する一覧表、それがないと見えなくなる、とはどういう意味でしょうか。

    No.2の回答に寄せられた補足コメントです。 補足日時:2016/09/29 17:24

A 回答 (3件)

スコープ


変数名からオブジェクトを参照する一覧表。
これが無いとオブジェクトが見えなくなる。

スコープチェーン
スコープが発生する構文は入れ子状態で定義できるので、
スコープをスタックの様に積み重ねとして表したもの。

変数を探していく仕組み
その時点でのスコープチェーンにて、
スタックの一番上から順に辿って変数名を見つけること。
スタックの一番下にある「グローバルスコープ」でも見つからなかったらエラー。

静的スコープ
プログラムを書いた時点で、スコープチェーンが決まっていること。

動的スコープ
呼び出し方によって、スコープチェーンが変わること。
JavaScript には存在しない。

クロージャー
一般にスコープはブロック範囲内の実行が終わったら無用となるので消されるが、
そのまま消さないで残したままにする仕組み。
関数オブジェクトに、その時点でのスコープチューンを「束縛」するイメージ。
この回答への補足あり
    • good
    • 1

スコープを概念的に捕らえると面倒なので、実装よりで説明してみました。



オブジェクトを参照する一覧表
JavaScript のエンジンが実行時に使う「シンボルテーブル」のこと
Web ブラウザの開発ツールでは、実行中断時にデバッグ情報 "Scope" として表示できる
シンボルテーブルに無い変数名は名前解決できない。つまり「スコープ外」とされオブジェクトが見えなくなる

関数スコープ
関数の実行を開始した時に生成される「シンボルテーブル」であり、関数の実行が終われば破棄される
関数の外側を実行中は、このテーブルは存在しない or 破棄された後なので、関数内変数は「スコープ外」となる。

グローバルスコープ
最初から用意されており必ず存在する「シンボルテーブル」なので、どこからでも「スコープ内」になる

参考)
https://ja.wikipedia.org/wiki/シンボルテーブル
    • good
    • 0

https://teratail.com/questions/49315

そもそも最初の認識が間違ってるからなぁ....
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!