JavaScript:设置为回调函数或匿名函数 我的问题

JavaScript:设置为回调函数或匿名函数 我的问题,javascript,ajax,callback,onload,anonymous-function,Javascript,Ajax,Callback,Onload,Anonymous Function,我一直在从两个不同的互联网资源学习AJAX的基础知识。在发送异步HTTP请求的多步骤过程中,在XHR请求对象上调用.onload属性,然后将其设置为1)匿名函数或2)回调(?我认为是这样说的)的方式中存在一个小的不一致 第一种方法 对ourRequest对象调用.onload属性,并将其设置为匿名函数: ourRequest.onload = function() { // the code goes here } 第二种方法 对asyncRequestObject对象调用.on

我一直在从两个不同的互联网资源学习AJAX的基础知识。在发送异步HTTP请求的多步骤过程中,在XHR请求对象上调用
.onload
属性,然后将其设置为1)匿名函数或2)回调(?我认为是这样说的)的方式中存在一个小的不一致


第一种方法 对
ourRequest
对象调用
.onload
属性,并将其设置为匿名函数

ourRequest.onload = function() { 
  // the code goes here 
} 

第二种方法 对
asyncRequestObject
对象调用
.onload
属性,并将其设置为函数名(回调)


我的问题 第一种方法和第二种方法的工作原理有什么区别

那么,是否有任何理由使用第一种方法而不是第二种方法

第一种方法和第二种方法的工作原理有什么区别

区别在于第一个函数是匿名的函数表达式,而第二个函数是具有名称的函数。两者都是XMLHttpRequest的“load”事件的事件处理程序

那么,是否有任何理由使用第一种方法而不是第二种方法

如果您不打算在其他地方重用处理程序,那么就不需要用名称声明函数


它与其他编程实践没有什么不同。当一个值被多次调用时,请使用变量/常量,否则请使用文字。

函数声明在当前范围内创建一个(已提升)变量,该变量与函数同名,其值是对该函数的引用

函数表达式的计算结果只是作为对该函数的引用


因此,主要区别在于,在使用
handleSuccess
的地方,可以继续引用该函数以用于其他目的。

除了第二个函数使用命名函数外,它们是相同的。什么时候使用取决于使用——如果您对几个不同的事件使用相同的处理程序,那么命名函数是有意义的。我认为到目前为止答案是好的,但是他们没有回答“匿名函数vs.回调”的问题。通常,回调是一个角色,而不是一个语法特性。它说:“如果您将它作为参数传递,它将在将来某个时候被调用”,这意味着它必须是函数,但不要求它是命名的、匿名的、箭头函数或类方法。@ggorlen它们不相同。函数声明被挂起。@jhpratt“除了第二个使用命名函数外”,是吗?@ggorlen这不重要,只是为了调试,真的。重要的是提升(和潜在的范围污染)。我明白了,但是如果第一种方法是将
ourRequest.onload
设置为命名函数,会怎么样?那么它与第二种方法有什么不同呢?根本没有什么不同。您只需要在当前范围中有一个名为
handleSuccess
的变量。您是否需要这样一个变量是您应该问自己的唯一问题。现在,在第一个问题中,ourRequest.onload被设置为handleSuccess函数
ourRequest.onload=function handleSuccess(){}
2nd
function handleSuccess(){}asyncRequestObject.onload=handleSuccess
当您说在第一种情况下,在当前作用域中有一个名为handleSuccess的变量时,您是什么意思?
函数handleSuccess(){}
在某种程度上类似于编写
var handleSuccess=function(){}
。您正在声明一个名为
handleSuccess
的变量。如果您声明函数2次并将其影响为asyncRequestObject.onload 2次,则没有任何区别。现在,在第一种方法中,我们的request.onload被设置为handleSuccess函数
ourRequest.onload=function handleSuccess(){}
而第二种方法保持不变
function handleSuccess(){}asyncRequestObject.onload=handleSuccessfunction handleSuccess () { 
  // the code goes here
}

asyncRequestObject.onload = handleSuccess;