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对象。我发现函数在对象范围内initialize运行。但什么是范围?bindEventsapponDeviceReady

我尝试在以下代码中编写下一个代码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 回答