0

私は JavaScript について深い知識がなく、この状況を変えようとしています。しかし、JavaScript カスタム オブジェクト関数のスコープの一部のロジックは、私には意味がありません。

例: これは、既定のプロジェクト テンプレート (Windows Phone 7 用) の PhoneGap コードの一部です。

var app = {
    initialize: function() {
        this.bindEvents();
    },
    bindEvents: function() {
        document.addEventListener('deviceready', this.onDeviceReady, false);
    },
    onDeviceReady: function() {
        app.receivedEvent('deviceready');
    },
    receivedEvent: function(id) {
        console.log('Received Event: ' + id);
    }
};

オブジェクトを作成するためにオブジェクトリテラルを使用しappます。私はそれを理解しinitializebindEvents関数はappオブジェクトスコープで実行されます。しかし、onDeviceReadyスコープとは何ですか?

の中に次のコードを書き込もうとしましたonDeviceReady:

console.log(this == document);\\out: false
4

1 に答える 1

0

あなたの問題はここで起こっています:

document.addEventListener('deviceready', this.onDeviceReady, false);

メソッドがイベントエミッタによって呼び出されると、リスナーがバインドされているため、onDeviceReady設定されたコンテキスト。document

次を使用して修正できます。

document.addEventListener('deviceready', this.onDeviceReady.bind(this), false);

または、古いブラウザーをサポートするソリューション:

var self = this;
document.addEventListener('deviceready', function() {
    self.onDeviceReady.apply(self, arguments);
}, false);

ユーティリティ ライブラリのアンダースコアを使用する場合は、クロス ブラウザを使用できます_.bind

document.addEventListener('deviceready', _.bind(this.onDeviceReady.bind, this), false);
于 2013-08-14T15:56:26.047 に答える