2

Backbone.jsのTodo.jsチュートリアルで「これ」が何を指しているのか理解するのに苦労しています。具体的には、AppView内で:

initialize: function() {
this.input = this.$("#new-todo");
this.allCheckbox = this.$("#toggle-all")[0];

Todos.bind('add', this.addOne, this);
Todos.bind('reset', this.addAll, this);
Todos.bind('all', this.render, this);

this.footer = this.$('footer');
this.main = $('#main');
},

したがって、Todos.bind('add'、this.addOne、this)が呼び出されると、ビュー(this.addOne)がコレクション('add')にバインドされます。その場合、3番目のパラメーター(「this」)もAppViewオブジェクトを参照していると想定します。なぜ3番目のパラメータとして「this」が必要なのですか?

注釈付きのソースコード: http: //backbonejs.org/docs/todos.html

4

1 に答える 1

3

thisas 3番目の引数は、2番目の引数の関数が呼び出されたときに設定するコンテキストthisです。

それは非常に紛らわしいように聞こえるので、それを分解してみましょう。この行を見てみましょう...

Todos.bind('add', this.addOne, this);

代わりにこれを使用しましたか...

Todos.bind('add', function() { this.$el.text("Hello, world!"); });

...3番目の引数はまったく必要ありません。この場合、関数はすぐに呼び出され、this保持されます。

ただし、すべての関数をインライン化する必要はないため、次のように関数への参照を渡します...

Todos.bind('add', this.addOne, this);

これはあなたの例と同じです。のような関数を呼び出すと、呼び出された関数にthis.addOne()設定thisthisれます。

ただし、参照を渡すと(すぐに呼び出さないでください)、そのthisコンテキストは失われ、呼び出されると、なりますwindow。これは、必要なものではありません。

これを防ぐために、3番目の引数はthis関数が呼び出されるときに使用するコンテキストです。

内部的には、Backboneは_.bind()それをバインドするために使用します。bind()これは、関数のネイティブメソッドのポリフィルです。

于 2012-08-24T01:04:26.270 に答える