1

Backbone.js を学習しようとしています。RequireJS で Backbone を使用するアプリには、次のコードがあります。

define([
    'base/BaseView',
    'model/BaseModel',
    ], function(BaseView, 
        BaseModel){
        var myView = BaseView.extend({
            initialize: function() {
                this.Summary = new resultSummary({
                    scenId : this.options.scenario.get("scenId")
                });
            },
            renderCount : function(){
                var self = this;
                var currentStatus = self.model.get("myStatus");
            }
            render: function () {
            var self = this;
            var gridItems = [];
            gridItems.push({
                    id: "company.status", 
                    text: "Status",
                    width: "200px",
                    renderer: function() {
                        var partnerStatus = this.company.get("status");
                    }
            });     
            }
        }
    });

いくつかの概念についてはよくわかりません。

  1. var self = this と言うとき、「this」は正確に何を表しているでしょうか (これは、JS コードのどこかで「this」を使用する場合の一般的な質問として理解したいと思います)
  2. 上記のコードで「render」にいるときに renderCount Vs にいるときに初期化 Vs 内にいる場合、「this」は変わりますか?
  3. コード「this.company.get("status")」の場合、this.company は正確には何を表しているのでしょうか? それはモデルを指していますか?
4

2 に答える 2

2

閉鎖について質問していると思いますか?

私たちは割り当てる

var self = this;

そのため、ネストされた関数内でクラスのスコープを保持できます。この場合:

renderer: function() {
                    var partnerStatus = this.company.get("status");
                }

「クロージャー - JavaScript | MDN」は素晴らしい読み物です。

于 2013-07-17T12:24:17.923 に答える
2

問題のコードはおそらくより大きなコード ベースからコピーされているため、すべての質問に答えることはできないでしょう。

  1. var self = this; を使用する理由 上記のコードが実行されると、これは正確に何を表すでしょうか?

var self = this; スコーピングの問題を回避するために使用されます。コールバックを使用すると、これが別のオブジェクトに変更されることがあります。問題に言及されているコードは、これを直接使用できるという点では何のメリットもありません。

便利な例 - たとえば、モデルの変更をリッスンする必要があり、初期化メソッドにハンドラーをアタッチし、変更時にビューからいくつかのロジックを呼び出したいとします。

// view code
initialize: function() {
    console.log(this); // 'this' points to view
    this.listenTo(this.model, "change", function() {
        console.log(this); // 'this' points to model
        // calling 'this.someLogic();' would throw exception
    });
},

someLogic: function() {
    // ..
}

最初の例で説明した問題を回避するには、ビュー コンテキストの 'this' を他の変数に格納する必要があります (self という名前にする必要はありません)。

書き直された例:

// view code
initialize: function() {
    console.log(this); // 'this' points to view
    var self = this; // store this into variable that will won't be changed in different scope
    this.listenTo(this.model, "change", function() {
        console.log(this); // 'this' points to model
        console.log(self); // 'self' points to view
        self.someLogic(); // won't throw
    });
},

someLogic: function() {
    // ..
}

JavaScript のクロージャーがどのように機能するかを確認することをお勧めします。Backbone だけでなく、JavaScript 開発全般に役立ちます。

  1. 上記のコードで「render」にいるときに renderCount Vs にいるときに初期化 Vs 内にいる場合、「this」は変わりますか?

いいえ、Backbone は、メソッド化されたオブジェクトを含むビュー オブジェクトに「this」をポイントします。

  1. コード「this.company.get("status")」の場合、this.company は正確には何を表しているのでしょうか? それはモデルを指していますか?

本当にわかりませんが、推測することしかできませんが、それはBaseViewのプロパティです

于 2013-07-17T12:34:20.690 に答える