0

私はjavascriptが初めてです。ここで簡単な質問があります。

以下のコード スニペットが表示されます。

var self = this;
.....
self.push = function () {
    var args = [].concat.apply([], arguments);
    args.forEach(self.write);
    return self;
};

self.write is another function.

q1: self = this を設定する理由。

q2: なぜプッシュ関数を Arguments.forEach(self.write); のように単純に書けないのか

4

2 に答える 2

3

q1: self = this を設定する理由。

これは、内部関数が外部関数への参照をthisクロージャーに保持したい場合に使用されます。の値は、関数の呼び出し方法によって設定されるため、内側の関数には、外側の関数の を「シャドウする」this独自の があります。thisthis

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ます。

于 2012-10-18T06:14:56.993 に答える
0

Q1 Javascript では、"this" は時と場合によって別のものになることができます。

Q2 引数は配列に少し似ていますが、そうではありません。最初に配列を作成して、配列関数を呼び出すことができるようにします。

于 2012-10-18T06:15:09.423 に答える