var
このような状況での使用について、さまざまな意見を聞いています。
function(maybeUndefined) {
if(typeof maybeUndefined === 'undefined')
var maybeUndefined = 'bob';
}
の_ var
_ _ _maybeUndefined
argument
function
var
このような状況での使用について、さまざまな意見を聞いています。
function(maybeUndefined) {
if(typeof maybeUndefined === 'undefined')
var maybeUndefined = 'bob';
}
の_ var
_ _ _maybeUndefined
argument
function
var
この場合、は関数のスコープ内で既に割り当てられているため、必要ありませんmayBeUndefined
(ヒント: 関数定義で引数変数をリストすると、それらの変数がローカルで宣言されます)。したがって、これvar
は完全にオプションですが、完全に無意味です (そして読みやすさを損ないます)。
例:
function func ( arg1, arg2 ) {
var local1, local2;
function nested1 () {}
function nested2 () {}
// other code
}
ここに関数宣言があります。この宣言が解析されて関数オブジェクトになると、その関数のレキシカル環境 (= スコープ) が次のバインディングで作成されます。
( と という 2 つの特別な組み込みバインディングもあることに注意してくださいthis
。arguments
これらは常にすべての関数オブジェクトに対して作成されます。)
これらの名前は、ローカル バインディングとして定義されます。(このプロセスは「宣言バインディングのインスタンス化」で指定されています。警告: このアルゴリズムは人間が読み取ることを意図していません:-)
) したがって、名前がパラメーターとして定義されている場合、それをローカル変数として宣言する必要はありません。このメカニズムは、関数の呼び出し時にそのパラメーターに値 (引数) が渡されるかどうかとは無関係です。
そのため、次のように関数を呼び出しても:
func(123);
名前arg2
は引き続き (関数の環境でバインディングとして) 定義されますが、その値は最初はundefined
その特定の呼び出し用になります。
ところで、厳密な言語を使用する場合(推奨!)、関数環境は静的です。つまり、上記のバインディングが関数の環境で唯一のバインディングであることが保証されます。一方、デフォルトの言語は、関数の環境からバインディングを動的に追加/削除する特定のメカニズムを提供します。例:
(function () {
// the name "temp" does not exist as a binding in the function's environment
eval('var temp');
// now it does
delete temp;
// and it's gone again
}());
再度使用しないでくださいvar
。可読性が悪く、引数であるため、変数は既にローカルにスコープされています。
また、 の一部ではないことに注意してくださいthis
。this
キーワードが使用されている場合にのみ関数オブジェクトにスコープさnew
れます。名前付き関数がないため、この場合はありそうにありません。newがなければ、ローカル スコープを持つ引数の結果として、変数が間違いなくその一部ではないthis
ウィンドウ (または isが使用されている) を参照します。undefined
use strict;