2009年10月12日月曜日

[JavaScript] JavaScriptで気をつけるべきこと

・ブロックレベルのスコープが存在しない

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は関数もデータ型として扱ってるからかなぁ

2 件のコメント:

  1. 無名関数もつかえるよ

    返信削除
  2. なるほど!無名関数もできるのか!

    って、無名関数と匿名関数の違いは何なのかっていうねw

    返信削除