4

varこのような状況での使用について、さまざまな意見を聞いています。

function(maybeUndefined) {
    if(typeof maybeUndefined === 'undefined')
        var maybeUndefined = 'bob';
}

の_ var_ _ _maybeUndefinedargumentfunction

4

4 に答える 4

10

varこの場合、は関数のスコープ内で既に割り当てられているため、必要ありませんmayBeUndefined(ヒント: 関数定義で引数変数をリストすると、それらの変数がローカルで宣言されます)。したがって、これvarは完全にオプションですが、完全に無意味です (そして読みやすさを損ないます)。

于 2013-05-29T20:46:41.660 に答える
6

例:

function func ( arg1, arg2 ) {
    var local1, local2;

    function nested1 () {}
    function nested2 () {}

    // other code
}

ここに関数宣言があります。この宣言が解析されて関数オブジェクトになると、その関数のレキシカル環境 (= スコープ) が次のバインディングで作成されます。

  • arg1
  • arg2
  • ローカル1
  • ローカル2
  • ネストされた1
  • ネストされた2
  • これ
  • 引数

( と という 2 つの特別な組み込みバインディングもあることに注意してくださいthisargumentsこれらは常にすべての関数オブジェクトに対して作成されます。)

これらの名前は、ローカル バインディングとして定義されます。(このプロセスは「宣言バインディングのインスタンス化」で指定されています。警告: このアルゴリズムは人間が読み取ることを意図していません:-)) したがって、名前がパラメーターとして定義されている場合、それをローカル変数として宣言する必要はありません。このメカニズムは、関数の呼び出し時にそのパラメーターに値 (引数) が渡されるかどうかとは無関係です。

そのため、次のように関数を呼び出しても:

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

}());
于 2013-05-29T20:58:34.563 に答える
3

再度使用しないでくださいvar。可読性が悪く、引数であるため、変数は既にローカルにスコープされています。

また、 の一部ではないことに注意してくださいthisthisキーワードが使用されている場合にのみ関数オブジェクトにスコープさnewれます。名前付き関数がないため、この場合はありそうにありません。newがなければ、ローカル スコープを持つ引数の結果として、変数が間違いなくその一部ではないthisウィンドウ (または isが使用されている) を参照します。undefineduse strict;

于 2013-05-29T20:51:18.460 に答える