Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript arguments属性可由此访问。某些函数。arguments?事实上我无法解释?_Javascript - Fatal编程技术网

Javascript arguments属性可由此访问。某些函数。arguments?事实上我无法解释?

Javascript arguments属性可由此访问。某些函数。arguments?事实上我无法解释?,javascript,Javascript,我在读一本JavaScript书籍,我在读如何通过原型扩展JavaScript数组的数组功能,然后我来到了这个我无法理解的示例,没有对它进行深入的解释,我无法理解: Array.prototype.some_function = function(){ var args = this.some_function.arguments; // 1 var args_length = this.some_function.arguments.leng

我在读一本JavaScript书籍,我在读如何通过原型扩展JavaScript数组的数组功能,然后我来到了这个我无法理解的示例,没有对它进行深入的解释,我无法理解:

Array.prototype.some_function = function(){
    var args = this.some_function.arguments;                   // 1
    var args_length = this.some_function.arguments.length;     // 2
    ...
} // some_function
在这里我可以访问参数,但我不知道这是如何工作的,意思是指我们调用这个方法的对象(在这个上下文中是数组),然后一些函数指的是该对象的属性,意思是指我们正在实现的函数,但是参数不是这个函数的静态属性,那么它是如何工作的呢?它仅在调用上下文中有效,我无法将其用于其他情况,例如:-

this.some_other_function.arguments // gives error

这似乎是JavaScript的一个不推荐的特性。请参阅说明以下内容的文档:

已弃用

此功能已从Web标准中删除。虽然有些 浏览器可能仍然支持它,它正在被删除。 不要在旧项目或新项目中使用它。使用它的网页或Web应用程序可能会 随时休息

这种行为确实出乎意料。这可能就是它被弃用的原因。正如您所说,函数是一个静态对象,那么它怎么可能有动态的
参数
?好吧,我想除了显而易见的解释之外没有其他解释了:JavaScript引擎在每次调用之前将
参数
值分配给函数

顺便说一句,有一个更简单的代码演示了相同的情况:

function f() { return f.arguments; }
f(8);                 // returns [8]
f(8, 9);              // returns [8, 9]
f.arguments === null  // true

当然,解决方案是使用局部变量
参数
而不是
函数参数
,请参阅。

参数对象可作为局部变量用于所有函数。
您可以在函数内使用参数对象,但不能通过实例访问它们。
通过function.arguments访问参数是javascript提供的一种奇怪的功能,目前已被弃用。
基本上,当您执行function.arguments时,它会给出堆栈中当前执行的函数的arguments变量。 尝试浏览我的代码并阅读控制台。。为了更清楚

var someconstructor=function(){
log('someconstructors参数');
log(参数);
//SomeConstructor当前正在堆栈中执行
//通过function.arguments访问其参数
log('someconstructors参数使用function.arguments进行访问');
log(someconstructor.arguments);
};
someconstructor.prototype.method=函数(){
log('methodarguments');
log(参数);
//方法正在堆栈中执行
//通过function.arguments访问其参数
log('使用function.arguments访问的方法参数');
log(this.method.arguments);
};
var newObject=newsomeconstructor(1,2);
方法(1,2,12,23,23,232,3)JavaScript的主要概念是“一切都只是一个对象”,因此数组是一个具有原型和构造函数的对象

任何声明为对象属性的函数都称为方法,参数是您在函数内部传递的参数,例如:

function Add(a,b)
{
  console.log(this.arguments) // logs an array-like of [a,b]
  return a+b;
}
方法定义在哪里?仅在原型范围内,这意味着您无法在其他地方访问方法属性,除非您将方法本身或其构造函数传递给该其他范围

你可以参考科迪·林德利(cody lindley)写的一本名为《JavaScript简明》的书,
这本书需要一些关于JavaScript的高级知识

根据

此功能已从Web标准中删除。虽然有些 浏览器可能仍然支持它,它正在被删除。 不要在旧项目或新项目中使用它。使用它的网页或Web应用程序可能会 随时休息


这难道不能回答您的问题吗?下面的评论很有启发性:“在递归的情况下,即如果函数f在调用堆栈上出现多次,则f.arguments的值表示对应于函数最近调用的参数。”