q1: self = this を設定する理由。
これは、内部関数が外部関数への参照をthis
クロージャーに保持したい場合に使用されます。の値は、関数の呼び出し方法によって設定されるため、内側の関数には、外側の関数の を「シャドウする」this
独自の があります。this
this
q2: なぜプッシュ関数を Arguments.forEach(self.write); のように単純に書けないのか
引数オブジェクトは配列ではないため、メソッドがありませんforEach
。この線:
var args = [].concat.apply([], arguments);
引数オブジェクトからのメンバーで配列を作成します。また、次のこともできます。
[].forEach.call(arguments, ...)
または(多くの人に好まれています):
Array.prototype.forEach.call(arguments, ...);
編集
ジャックによって提起されたポイントは、とにかくthis
関数内にあるかのように見えるということです。self
ただし、関数の割り当て方法や作成方法 ( ES5 bindthis
を無視) ではなく、呼び出しによって設定されるため、呼び出しを見るまで関数がどうなるかわかりません。あなたはそれを投稿していないので、私たちは知りません. 例えばthis
self.push = function () {
...
}
ここで、関数が呼び出された場合、self.push()
とにかくにthis
設定されます。self
ただし、それthis
が他の何かに設定されている場合、たとえば
var pushAlias = self.push;
...
pushAlias();
Hereself.push
は設定されずに呼び出されるthis
ため、デフォルトでグローバル/ウィンドウ オブジェクト (厳密モードでは未定義) になります。関数内で使用self
することは、それが問題ではないことを意味します。関数は、メソッドthis
に割り当てられた時点でまだ外部への参照を持っていpush
ます。