if (何かしらの条件) {
var i = 5;
}
document.writeln(i);
C++やjavaなら、if文の中で宣言されている変数はその中でしか使用できないが、JavaScriptはブロックレベルのスコープが無いので、上の例のようにif分の外でも参照できるんだそうです
・関数のスコープ処理の違いについて
JavaScriptでは関数の定義の仕方が3種類(通常のfunction文、Functionコンストラクタ、匿名関数)あるんですが、どうもスコープの処理が違うらしい
var scope = '外のスコープ';
function checkScope() {
var scope = '内のスコープ';
function normalFunc() { return scope; } // (1)
var anonymousFunc = function() { return scope; }; // (2)
var constructFunc = new Function('return scope'); // (3)
document.writeln(normalFunc()); // (1)を実行して表示
document.writeln(anonymousFunc()); // (2)を実行して表示
document.writeln(constructFunc()); // (3)を実行して表示
}
checkScope();
まず外側に「外のスコープ」を表す変数scopeがあり、更にcheckScope関数の中に「内のスコープ」を表す変数scopeがあります。更に中では通常の関数(1)と、匿名関数(2)、Functionコンストラクタ(3)をそれぞれ定義してます。ただ単にscopeの中身を返すだけです。その後にそれぞれ画面に表示させて見ます。すると、(1)と(2)は「内のスコープ」が表示されましたが、(3)だけ「外のスコープ」と表示されました。
理由はFunctionコンストラクタでは「グローバルオブジェクトからなるスコープチェーンを引き渡す」という仕様で、ようは一番外側のグローバルオブジェクト関連の情報が渡されて、その中にあるscopeを表示するという流れだということです
このコードを書いてて気づいたんですが、関数の中に関数を定義できるんですね。JavaScriptは関数もデータ型として扱ってるからかなぁ
無名関数もつかえるよ
返信削除なるほど!無名関数もできるのか!
返信削除って、無名関数と匿名関数の違いは何なのかっていうねw