1

私はJavascriptで「this」のコンテキストを試していますが、理解できない状況があります。

ここから見つけたjavascriptの動作方法に基づいて、オブジェクトで関数が呼び出されると、オブジェクトが最も起動したパラメーターとして暗黙的に(またはcallメソッドを使用するときに明示的に)渡されることを理解しています。

しかし、私がテストしようとしたが、期待したことをしなかった2つのケースがあります。//なぜ機能しないのですか?の後の2行を見てください。次の2つの値が定義されていないのはなぜですか?

これがjsFiddleのコードです(これも下に貼り付けられています)

function Beta(c, myValParam) {
  var callback = c;
  this.myVal = myValParam;
  this.RunCallback = function () {
   callback();
  }

  this.ShowVal = function () {
    alert("FROM Beta: " + this.myVal);
  }
}

function Alpha() {
  this.myVal = "Alpha's Property";
  this.ShowVal = function () {
    alert("FROM Alpha: " + this.myVal);
  }
}
a = new Alpha();
a.ShowVal();

b = new Beta(a.ShowVal, "Beta's property passed in");
b.ShowVal();

//Why doesn't ths work? Why are the follwoing 2 values undefined?
b.RunCallback.call(b); //Shouldn't this display the value in b?
b.RunCallback();

b2 = new Beta(function() { return a.ShowVal.call(a); }, "Z");
b2.RunCallback();

編集: Quentin、dystroy、doughからの回答のおかげで、コンテキストがウィンドウオブジェクトに戻ったときに生成される値を表示するようにjsFiddleを更新しました

そして、これが私が抱えていた問題を修正する呼び出しを含むコードです callback.call(this)

4

3 に答える 3

2

これはbの値を表示するべきではありませんか?

bで何もしない関数を(コンテキストで)呼び出していthisます。その関数は、 (デフォルトオブジェクト)のコンテキストで(のcallbackコピーである)を呼び出します。a.showValwindow

于 2013-01-14T15:39:46.487 に答える
1

RunCallback:の定義の1つのステップを忘れました。

交換

callback();

callback.call(this);
于 2013-01-14T15:39:57.407 に答える
1

あなたの問題は、あなたが呼び出すとき、あなたcallbackは文脈を渡していないので、あなたは負けているということだと思いますthis。次のようにRunCallbackを更新してみてください。

  this.RunCallback = function () {
   callback.call(this);
  }
于 2013-01-14T15:45:42.867 に答える