2016-05-31 1 views
0

これは一般的なJSの質問であり、バックボーンに限定されているわけではありませんが、私はバックボーンを学んでいたのでこれに遭遇しました。以下の最初の例では、エラーは発生しませんが、2番目の例では同じではありません。後者の例ではChrome Dev Toolsにエラーが表示されるが、最初のエラーは表示されない場面で何が起こっているのか説明できますか?私の推測では、何かが関数内にあるとき(初期化など)、ブラウザがスクリプトを読み込んでいるときにすぐに実行されるのではなく、定義されているクラスの一部である場合(この場合はapp.ItemView)コンテキストオブジェクトを構築するためにはブラウザがthis.model#getを読み取る必要があるように、オブジェクトコンテキストを完了する必要があります。バックボーンとハンドルバーのコンテキストを初期化関数に追加するとエラーが発生するのはなぜですか?

app.ItemView = Backbone.View.extend({ 
    initialize: function() { 
     this.context = { 
      title: this.model.get("title"), 
      completed: this.model.get("completed") 
     } 
    } 
}); 

app.ItemView = Backbone.View.extend({ 
    context: { 
     title: this.model.get("title"), 
     completed: this.model.get("completed") 
    } 
}); 

キャッチされない例外TypeError:プロパティを読み取ることができません

未定義の編集の '取得':第1の実施のISNのコンテキスト場合、それはまた、動作しません。適切に定義されている -

app.ItemView = Backbone.View.extend({ 
    initialize: function() { 
     this.context.title = this.model.get("title"); 
     this.context.completed = this.model.get("completed"); 
     this.render(); 
    } 
}); 

キャッチされない例外TypeErrorは:mu is too shortのコメントを読んだ後thisの未定義

答えて

1

EDIT修正し、説明のプロパティ 'GET' を読み込めません。

エラーの主な理由は、コードの2番目の部分のthiswindowまたはBackbone.View.extendが呼び出されている関数の呼び出し元を参照できることです。オブジェクト

model性質を持っていないので、undefinedだとエラーにgetundefinedの結果を呼び出します。

initializeは、利用可能なmodelプロパティを持つBackbone.Viewオブジェクトによって呼び出されるため、関数にする必要があります。この場合、thisはBackbone.Viewオブジェクトを参照します。

+2

2番目の例の 'this'は' extend'呼び出しの外にあっても(おそらくブラウザの 'window')、それは' {context:{...}} 'オブジェクトではありません'extend'に渡されます。 –

+0

これは間違った質問ですが、何かがまだ定義されていない場合でも、最初の例のように、javascriptはそれで問題ありませんか? "this"がウィンドウを参照している場合、動作しませんが、initializeメソッドでは、まだ作成されていないインスタンスオブジェクトを参照する "this"ではありませんか?なぜJavaScriptはエラーをスローしないのですか? – akantoword

+0

私は、関数が異なるオブジェクトの下で実行できるので(例えば、 'bind'を使ったり、別のオブジェクトのプロパティに関数を割り当てるなど)、bodyの' this'のインスタンスは関数走るhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this#As_an_object_method –

関連する問題