0

私は比較的経験豊富な c# (およびその前の c++ Win32) 開発者であり、javascript を初めて使用し、thisポインターに関して質問があります。

私は knockout.js を使用しており、subscribe と呼ばれる 1 つの関数がthis変数を受け入れます。この変数は、コールバック関数内で設定されます。

Win32 の時代と C# の考え方からすると、どのコールバック関数でも、自分の状態を含むスコープ オブジェクトが必要です。

この場合、thisjavascript を使用してコールバック スコープを設定しました。

私の質問は次のとおりです。

  1. これですべてが機能します(興味がある場合は、ここで完全なフィドルを使用してください)が、何かひどいことをしましたか?

  2. 明示的なスコープ変数をパラメーターとして渡す代わりに使用される理由thisはありますか (これにより、私にとって理解しやすくなります。これにより、動作が隠されます)。

  3. 使用目的は何thisですか?

http://knockoutjs.com/documentation/observables.htmlから、次のように書かれています。

サブスクライブ関数は 3 つのパラメーターを受け入れます。 callback は通知が発生するたびに呼び出される関数で、 target (オプション) はコールバック関数で this の値を定義し、 event (オプション。デフォルトは「change」) はイベントの名前です。の通知を受け取ります。以下の例

myViewModel.personName.subscribe(function(oldValue) {
    alert("The person's previous name is " + oldValue);
}, null, "beforeChange");

以下の私のコードスニペット:

var computedOptions = createComputedDepdency(viewModel[option.requires.target],option.data);
viewModel[option.optionsName] = computedOptions;

console.log("making callback scope object for: " + option.optionsName );
var callbackScope = {
    callbackName: option.optionsName,
    options: computedOptions,
    selectedValue: viewModel[option.selectedName]
};

// when the list of available options changes, set the selected property to the first option
computedOptions.subscribe(function () {
    var scope = this;
    console.log("my object: %o", scope);   
    scope.selectedValue(scope.options()[0].sku);
    console.log("in subscribe function for..." + scope.callbackName);
},callbackScope);
4

3 に答える 3

1

JavaScript では、'this' は関数を呼び出したオブジェクトを指します。「new」キーワードを使用する状況でのみ、現在のオブジェクト (関数) を指すことが期待できます。

var MyObject = function () {
  this.hello = function () { console.log(this); }
}

var instance = new MyObject();

これが常に期待どおりであることを確認する方法があり、それは変数を作成して正しい参照を保存し、これの代わりにそれを使用することです...あなたの例では、これに似ています...

computedOptions = function () {
  var that = this;
}

computedOptions.subscribe(function () {
    console.log("my object: %o", scope);   
    scope.selectedValue(that.options()[0].sku);
    console.log("in subscribe function for..." + that.callbackName);
},callbackScope);

MDN JavaScript リファレンスは、必然的に私よりもよく説明するでしょう。それを見てください。

于 2013-10-19T18:53:07.367 に答える
0

You shouldn't mix scope and this. this is supposed to mimic classical-oop languages like java or++, that is to keep the reference to an instance object. But it can be used just to execute arbitrary function on a given context using .apply() or .call.

What about scope, you don't have to do anything to pass the scope to a function, since the outer scope becomes automatically accessible inside function. You should read about closures - it's the best part of javascript.

于 2013-10-19T18:51:13.737 に答える