Javascript参数对象

Javascript arguments object

本文关键字:对象 参数 Javascript      更新时间:2023-09-26

我很难理解arguments对象。在这段代码中,参数将关注什么函数?

getAjax('get_info', 'java_array', realVarName, cld.listArray, 0, '',           
'no_restrict', function() {
 show_list(arguments[0], sld);
    if (typeof(postFunc) == "function") {
        postFunc();
    }
 });

"arguments"是一个具有任何函数的继承变量。它包含传递给函数的所有参数。例如,函数定义可能不列出任何参数,但调用可能包含"n"个参数。然后,函数仍然可以通过参数数组访问所有参数。

arguments对象是一个类似Array的对象,与传递给函数的arguments相对应。

在您的代码中,arguments[0]将主要是undefined

首先,arguments是一个对象,表示传递给当前函数的参数集。它自动存在于每个函数内部。你可以在MDN上阅读更多关于它的信息。

因此,在您的情况下,arguments[0]将是getAjax()传递给回调的第一个参数,而回调是您调用getAjax()时传递给它的最后一个参数。因此,这取决于getAjax()的内部行为,而您没有向我们展示。

让我们来了解一下您的代码是如何工作的:

  1. 您可以对getAjax()进行函数调用,并向其传递一些参数
  2. 其中一个参数是回调函数(最后一个参数)
  3. getAjax()执行其工作时,它将在某个时刻调用该回调函数
  4. 当它调用回调函数时,它可以向回调传递一些参数
  5. 在该回调函数中,arguments对象将表示getAjax()传递给它的任何参数
  6. 因此,当(在回调函数中)获得arguments[0]并将其传递给show_list()时,将传递getAjax()传递给回调的第一个参数

您可以在不使用arguments对象的情况下重写代码,只需为回调声明一个命名参数:

getAjax('get_info', 'java_array', realVarName, cld.listArray, 0, '',  
  'no_restrict', function(obj) {
    show_list(obj, sld);
    if (typeof(postFunc) == "function") {
        postFunc();
    }
 });

在这个替代实现中,将回调函数的第一个参数命名为obj,并直接使用它,而不是使用arugments[0]。您的实现和这两者都会产生相同的结果。


当您知道要将哪些参数传递给函数时,通常最好使用命名参数(如我的替代实现中的obj),因为这会使代码更加自我文档化。但是,当您不知道将有多少参数传递给一个函数,或者当您想将传递给您的函数的任何参数传递给其他函数(转发或代理)时,arguments对象可能特别有用。