3

Knockout.js で計算されたオブザーバブル関数を使用する 2 つの方法を比較しています

質問:

  1. 関数内の「this」キーワードは、その親オブジェクトを参照できますか (関数内ではなく、外部)?
  2. 最後にコンテキスト値を入れなくてもバージョン 2 が機能するのはなぜですか?

        ///Version 1
        my.Product = function () {
            this.id = ko.observable();
            this.salePrice = ko.observable();
            this.photo = ko.observable();
            this.shortDescription = ko.observable();
            this.photoUrl = ko.computed
            (function () {
                return photoPath + this.photo();
            },this);  //**context**
        };
    
        ////version 2
        my.Product = function () {
            var self = this;
            self.id = ko.observable();
            self.salePrice = ko.observable();
            self.photo = ko.observable();
            self.shortDescription = ko.observable();
            self.photoUrl = ko.computed(function () {
                return photoPath + self.photo();
            });//why there is no "self" here
        };
    
4

1 に答える 1

2

あなたの最初の質問を理解しているかどうかわかりません。最初のケースでは、「this」を渡して、計算された関数で「this」として「this」を参照できるようにします。これはノックアウトに固有のものですが、ノックアウトはおそらくcallまたはapplyを使用します。どちらも「これ」を再定義できます。2 番目のパラメーターとして "this" を渡さなかった場合、"this" は計算された関数のスコープを参照します。そして this.photo は undefined です。

2 番目のケースは、一般的な JavaScript の「トリック」です。それは、変数に「this」を割り当てて、別のスコープで参照できるようにすることです。「self」は変数であり、関数からアクセスできるため、パラメーターとして「self」を渡す必要はありません。

どちらの例も有効です。私は個人的には 2 番目の方法を好みます。これは、JavaScript の実行コンテキストを処理するより一般的な方法だからです。

于 2013-07-12T06:16:05.930 に答える