私はスコープが匿名関数を使ってJavaScriptでどのように処理されるかについて私が知っているすべてを無視するような問題を抱えていますが、それは私が考えていない何か他のものかもしれません。JavaScriptクラスのイベントリスナーで古いコンテキスト変数が表示されるのはなぜですか?
function Element(boxElement) {
var self = this;
// Set jquery instance variables
self.pageElement = null;
self.boxElement = boxElement;
... blah blah blah
// Implement triggers to empty functions
self.onElementClicked = function() {};
// Bind listeners
self._bind_listeners();
}
bind_listeners方法は、このような
Element.prototype._bind_listeners = function() {
var self = this;
self.boxElement.on('click', function (e) {
// Don't handle if handled already
if (e.isDefaultPrevented()) return;
console.log("Got past the return");
self.onElementClicked();
});
};
として定義され、コールバックを設定する方法もあります:
は、私は次のようにコンストラクタで、要素と呼ばれるJavaScriptオブジェクトを、持っていますメソッドonElementClicked:
Element.prototype.on_element_click = function(callback) {
var self = this;
self.onElementClicked = callback;
};
問題は私が遭遇しているon_element_clickメソッドを使用してコールバックを設定した場合、自分のメソッドは現在のインスタンスを認識しません。インスタンスは構築直後にどのように見えるかを確認します。
もっと具体的には、JQuery要素を参照するboxElementというインスタンス変数があります。また、Chromeのコンソールでは、インスタンス(self)がページの正しい要素を参照していますが、onElementClickedインスタンス変数(およびその他)はリスナー内から設定されていないようです。
私の説明を改訂したり、説明を求めても構いません。実装の観点から
:
私はこれを行う場合:
// Set default listener for element click
formElement.on_element_click(function() {
console.log("Hello");
});
リスナーをonElementClickedが設定されて表示されないためこんにちは言うことはありません。
しかし、私が代わりにこれを行う場合:
formElement.boxElement.click(function() {
console.log("Hello");
});
それは成功したと言い、「こんにちは」と私は混乱します。
問題を引き起こしている最初の例の 'formElement'の代わりに' .boxElement'プロパティにイベントをバインドするのに失敗していませんか? – Josh
最初の例は私がしたいことです。 boxElement変数は、プライベートである/そうでなければならない/存在しないインスタンス変数です。 on_element_clickメソッドは、コールバックを格納し、boxElement.clickの独自のリスナーを使用してコールバックを実行することになっています。 後でこのコールバックメソッドを新しいものでオーバーライドする可能性があるため、私はそれを第2の方法(単なる良いオブジェクト指向設計とは別に)で行うことができません。 (古いコールバックメソッドを意図的に削除する) –
プレーンな要素とイベントリスナ(jQueryではなく)で動作するようです。https://jsfiddle.net/fpfofczy/ - あなたのやり方に似ているかどうかは分かりません。 – skyline3000