0

これは、javascript 101 または Backbone 100 の質問である可能性があります。しかし、私はこの最初の質問をして、ここでからかわれないことに満足しています:)

次のコード スニペットは、Code School の Anatomy of Backbone JS コースからのものです。

render: function(){ 
    this.collection.forEach(this.addOne, this);
} 

addOne: function(todoItem){
    var todoView = new TodoView({model: todoItem}); 
    this.$el.append(todoView.render().el);

}

addOne 関数は render 関数から呼び出されています。addOne 関数定義は、1 つのパラメーター「todoItem」が渡されていることを示しています。しかし、レンダーから addOne への呼び出しを見ると、引数/パラメーターが渡されていません。コードが正しく機能する可能性はありますか?

お時間をいただきありがとうございます。

バーラト

4

4 に答える 4

0

this.renderを直接呼び出しませんthis.addOne。むしろ、関数自体を引数としてthis.collection.forEach渡し、 を呼び出します。this.addOneそれthis.collection.forEachを渡すのは関数を呼び出すことです。

より簡単な例として、このコード スニペット:

function call_function(f, arg)
{
    f(arg);      // call the function you passed in
}

call_function(alert, s);

これを行います:

alert(s);
于 2012-09-21T02:59:04.217 に答える
0

関数の最初の引数はforEachコールバック関数であり、forEach関数はその関数を呼び出し、配列の各要素をパラメーターとして渡します。

より視覚的に、 への呼び出しは次のようになりますforEach

this.collection.forEach(this.addOne, this) -> 
           |this.addOne(this.collection[0], 0, this.collection)
           |this.addOne(this.collection[1], 1, this.collection)
           |this.addOne(this.collection[2], 2, this.collection)
           |this.addOne(this.collection[3], 3, this.collection)
           |this.addOne(this.collection[4], 4, this.collection)
           |...
           |this.addOne(this.collection[n], n, this.collection)

..n配列の最後のインデックスを表しますthis.collection

パラメーターが1 つしか指定されていないため、関数addOneは 2 番目と 3 番目のパラメーターを無視します。addOneまた、thisfromは変数 fromaddOneに設定されます。thisrender

詳細については、Mozilla Developer NetworkおよびMSDNから入手できます。

于 2012-09-21T02:59:56.183 に答える
0

ドキュメントをご覧ください。それは実際にはすべて非常に簡単です。forEachコレクション内の各要素に対して 1 回呼び出しaddOne、パラメータを渡します(element, index, array)。この場合、addOne最初の引数以外は単純に無視されます。

于 2012-09-21T03:00:33.700 に答える
0

forEach は JavaScript 1.6 で実装されており、ドキュメントを見ると次のようになっています。

array.forEach(callback[, thisArg])

render の forEach 部分の 2 番目のパラメーターは、実際には「todoItem」である addOne 関数に渡される引数です。「this」は配列コレクションを参照し、このコレクション内の各アイテムに対して addOne コールバックが実行されます。

于 2012-09-21T03:01:38.070 に答える