いいえ。
そして、あなたはいくつかのことを混乱させているからです:
関数の引数は関数に対してローカルです (大きな「unless」を持ち、番号 2 に保存され
ます) オブジェクト (配列/関数を含む) または値を関数のスコープにエイリアスすることを目的としています。
目標は、外部コードから引数として何を渡すかに関係なく、内部コードを意味のあるものにするために、パラメーターの名前を好きな名前に変更できるようにすることです。
これは範囲とは関係ありません。
JS の変数は、オブジェクトの場合は参照によって渡され、スカラーの場合は値によって渡されます。新しいクロージャ
に渡すことの要点は、への参照ではなく、の値が引数として渡されることです。これは、クロージャを含め ない場合に発生します。i
i
i
オブジェクトを渡す場合、そのオブジェクトがi
( obj.i += 1
) を持っていた場合、クロージャであろうとなかろうと、各関数は の同じ値を指しますi
。なぜなら、それらはすべて同じオブジェクトへの同じ参照を共有するからです。 .
オブジェクトは参照によって渡され、スカラーは値によって渡されます。技術的
には文字列オブジェクトと数値オブジェクトがありますが、それらを直接オブジェクト指向で処理しなければ、すぐにスカラー値に変換されます。
var i = 3,
say_i = function () { console.log(i); };
対
var i = 3,
say_i = (function (val) { return function () { console.log(val); }(i));
最初のものはへの参照を与えi
ます。
が実行されると、リアルタイム say_i
で の値を確認し、それをコンソールに出力します。i
2 番目のものは、返された関数のアウター スコープに値を渡し、 name としてエイリアス化されていますval
。
数値は参照でval
はなく値で渡されるため、内部から変更されない限り、常に同じ値になります。
ループの外で関数を 1 回作成した場合も、これと同じ結果を得ることができます。
var add_log = function (el, val) { el.onclick = function () { console.log(val); }; },
i = 0,
el;
for (; i < ........) {
el = ....
add_log(el, i);
}
i
は値で渡されるため、すべての要素がval
スコープ テーブルに異なる値を持ち、すべての要素が異なる番号をログに記録します。