静的スコープ

静的スコープとは、プログラミング言語におけるスコープの一種のこと。

レキシカルスコープとも呼ばれ、対義語に動的スコープ(ダイナミックスコープ)も存在します。レキシカルには文脈上の、字面のなどの意味があり、文脈上の定められた位置によりスコープが決定づけられるものです。

スコープをスタックのように積み重ねたものをスコープチェーンと言いますが、静的スコープはこのスコープチェーンが、プログラムを書いた時点で決定されるのです。

※本ページにはPRが含まれます。

そもそもスコープとは?

静的スコープについて学ぶ前にスコープをおさらいしておきましょう。

変数名や関数名を参照する範囲

スコープは、変数名や関数名を参照する範囲を指します。スコープ外にある変数は、そこにある変数や関数だけでは参照できません。この範囲外にある変数はスコープ外となり、「見えない」という扱いをされます。

プログラミングにおいて、変数名や関数名で参照される範囲は小さいほうが望ましいとされています。参照範囲が広いと、バグや誤作動が多くなってしまうからです。

スコープも多くの分類が可能

スコープと一言で言っても、その分類は細かいです。公文範囲から分類できるもの。スコープ導入から分類できるものなど、その種類は多岐に渡ります。

局所スコープのように、関数やブロック範囲内に参照が限定されたスコープもあります。そして静的スコープのように、プログラミング言語の種類によって、あらかじめスコープチェーンが決まってしまうものもあります。

スコープチェーンとは

スコープチェーンについても説明しておきましょう。参照する定義があらかじめ定義づけられていない言語では、より上位のObjectに遡って変数を探しに行きます。この機構こそ、スコープチェーンです。

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

静的スコープは動的スコープのように、呼び出し方でスコープチェーンが変わる事はありません。プログラムを書いた時点で、参照するスコープチェーンが決まってしまいます。

Java Scriptのvar文は静的スコープである

静的スコープのわかりやすい例が、Java Scriptのvar文です。ブロックが異なる変数は内側にあるため、var文では参照できなくなります。静的スコープは、プログラミングの安全性や最適化が行いやすいなどの理由で採用されるものが多くなっています。

Java Scriptに動的スコープは実装されていない

静的スコープの対義語が動的スコープですが、Java Scriptにおいて動的スコープは採用されていません。

Java Scriptでは、プログラミングを組んだ時点で、スコープチェーンが決定されてしまうのです。

まとめ

プログラミングにおいて、変数名や関数名で参照する範囲をスコープといい、スコープを積み重ねたものをスコープチェーンといいます。静的スコープは、動的スコープと違いプログラミングの時点でスコープチェーンが決まってしまうのです。