Javascript XHR上载函数的单例引用不起作用

Javascript XHR上载函数的单例引用不起作用,javascript,jquery,upload,xmlhttprequest,Javascript,Jquery,Upload,Xmlhttprequest,为什么第一个案例不起作用?它是对完全相同的函数的引用,仅采用单例格式 案例1 var n = { doThis: function(e){ console.log('hello world'); } }; xhr.upload.onprogress = n.doThis(e); 案例2 xhr.upload.onprogress = function(e){ console.log('hello world'); } 应该是: xhr

为什么第一个案例不起作用?它是对完全相同的函数的引用,仅采用单例格式

案例1

var n = {
    doThis: function(e){
        console.log('hello world');
    }
};

xhr.upload.onprogress = n.doThis(e);
案例2

xhr.upload.onprogress = function(e){
        console.log('hello world');
    }
应该是:

xhr.upload.onprogress = n.doThis
您所做的是调用
n.doThis(e)
并将结果存储到
xhr.upload.onprogress
中,它应该是:

xhr.upload.onprogress = n.doThis

您要做的是调用
n.doThis(e)
并将结果存储到
xhr.upload.onprogress
在第一种情况下,您要调用
doThis
函数,必须将其分配给progress属性,例如

xhr.upload.onprogress = n.doThis;

在第一种情况下,您要调用
doThis
函数,必须将其分配给progress属性,例如

xhr.upload.onprogress = n.doThis;

在第一种情况下,调用函数并将返回值分配给
onprogress
属性

您希望分配函数本身:

xhr.upload.onprogress = n.doThis;

在第一种情况下,调用函数并将返回值分配给
onprogress
属性

您希望分配函数本身:

xhr.upload.onprogress = n.doThis;

在这两种情况下,您都在创建函数对象并将其分配给变量onprogress。对于案例1,您正在创建一个命名函数(请记住,这里的名称无关紧要,只是对创建的函数对象的引用),对于第二个案例,仍然是一个命名函数,除了这里,函数名称是对象xhr.upload上的一个属性

现在回到案例1不起作用的原因。正如其他人提到的,当您执行
xhr.upload.onprogress=n.doThis(e),您正在调用函数,onprogress现在指向函数调用的结果。但是,省略调用、删除
(e)
实际上会使onprogress成为对先前创建的函数对象的引用


希望能有所帮助。

在这两种情况下,您都是在创建函数对象并将其分配给变量onprogress。对于案例1,您正在创建一个命名函数(请记住,这里的名称无关紧要,只是对创建的函数对象的引用),对于第二个案例,仍然是一个命名函数,除了这里,函数名称是对象xhr.upload上的一个属性

现在回到案例1不起作用的原因。正如其他人提到的,当您执行
xhr.upload.onprogress=n.doThis(e),您正在调用函数,onprogress现在指向函数调用的结果。但是,省略调用、删除
(e)
实际上会使onprogress成为对先前创建的函数对象的引用


希望这能有所帮助。

谢谢,我认为我必须把这件事传下去(e)谢谢,我认为我必须把这件事传下去(e)