理解javascript中的事件处理和回调

时间:2014-10-11 19:05:03

标签: javascript javascript-events

我正在使用IndexedDB,我意识到我并没有真正使用JavaScript进行事件处理。

所以这是代码:

var request = indexeddb.open(bla, version);

request.onsuccess = function (event) {  };

所以open方法返回一个IDBOpenDBRequest对象,根据Mozillas网站,该对象继承自IDBRequest,除了属性和方法之外还有事件处理程序,其中一个正在成功:

https://developer.mozilla.org/en-US/docs/Web/API/IDBRequest.onsuccess

因此,在Mozilla网站上,onsuccess只是function () { }

现在,当数据库成功打开时,会触发“onsuccess”事件并调用适当的事件处理程序,在本例中是我定义的函数。但究竟是怎么发生的?

请求变量包含IDBOpenDBRequest的实例。所以当我写request.onsuccess = somefunction()时,我是否覆盖了IDBRequest类的默认函数?

我不明白为什么我可以写request.onsuccess = somefunction(event) { }以及如何将事件传递给该函数。

编辑:

function myObect() {
    this.open = function(a,b,c) {
        if (c > 20) {
            this.success("String");
        }
    };
};


var myrequest = new myObect();
myrequest.open(4,2,21);
myrequest.success = function (ev) {
    console.log(ev);
};

2 个答案:

答案 0 :(得分:3)

要创建类似的api,您可以执行以下操作:

function open(a, b, c) {
    var request = {};

    if(c > 20) {
        setTimeout(function() {
            if(typeof request.success === "function") {
                request.success("String");
            }
        }, 1);
    }

    return request;
}

var myrequest = open(4, 2, 21);
myrequest.success = function(ev) {
    console.log(ev);
};

这里,setTimeout是异步的,因此回调函数不会立即执行。当在JavaScript中运行任何异步任务时,当前正在执行的代码将在调用任何回调之前运行完成。因此,success保证在调用request.success之前设置。

Indexed DB open调用类似地运行异步任务,然后在完成时调度事件,最终将调用您的回调函数。

答案 1 :(得分:0)

  

我覆盖了IDBRequest-class的默认函数

看起来没有默认行为,因此您只需设置自己的功能。