【问题标题】:How come I can call a function with an argument, when the function is defined with no parameters?当函数定义为没有参数时,我怎么可以调用带有参数的函数?
【发布时间】:2013-03-10 15:27:04
【问题描述】:

美好的一天!

我偶然发现了一些我在 JavaScript 领域从未见过的东西,但我想这对于更了解该语言的人来说很容易解释。下面我有以下功能:(取自书中的代码:“JavaScript Ninja 的秘密”)

function log() {
  try {
    console.log.apply(console, arguments);
  }
  catch(e) {
    try {
      opera.postError.apply(opera, arguments);
    }
    catch(e) {
      alert(Array.prototype.join.call(arguments, " "));
    }
  }
}

如您所见,该函数是用一个空参数列表定义的,但是当我在本书后面看到他们实际上使用这样的函数时,我完全感到困惑......

var x = 213;
log(x); //Hmmm, I thought this function had an empty parameter list.

有人可以向我解释一下,为什么允许/可能调用该函数?支持此功能的 JS 中涉及哪些概念?提前谢谢,我很困惑。

最好的问候,

【问题讨论】:

标签: javascript


【解决方案1】:

您可以根据需要调用带有错误数量参数的函数。多余的参数将被忽略;缺少的参数将被赋予一个默认值。

从代码示例中可以看出,您可以访问实际通过“参数”对象传递的参数。

JavaScript 的设计原则之一是宽容而不是严格。如果有办法继续前进,JavaScript 就会继续前进。未能传递足够数量的参数在 JavaScript 中并不像在 C# 这样的语言中那样被认为是致命的,其中设计原则之一是“通过在编译时失败将可能的错误引起开发人员的注意”。

【讨论】:

  • 确实很有趣。好东西我总是可以在这里问,当这种事情出现时,我会完全无能为力。顺便说一句,CoffeeScript 是否以同样的方式支持这一点?
  • @JoseE:我从来没有用过 CoffeeScript,所以我不知道。
【解决方案2】:

Javascript 函数有一个隐含的arguments 参数,它是一个具有长度属性的类数组对象。

对于你可以做的log 方法。

function log(){

  alert(arguments[0]); 

  alert(arguments[1]);

}

你可以调用log。

log("first","second");

【讨论】:

  • arguments 不是一个真正的数组,它是一个类似数组的 object 具有length 属性。参考:es5.github.com/#x10.6
  • 感谢您的讨论,以及代码示例,可以像这样访问参数伪数组是件好事。谢谢你,先生!
【解决方案3】:

JavaScript 函数是variadic,即它们可以接受任意数量的参数。您可以通过arguments object 访问它们,并通过apply 传递可变数量的值。形参列表只是声明了一些变量名,它们是指向参数的指针,如果给定的参数少于定义的参数名,它们将默认为undefined。

【讨论】:

    【解决方案4】:

    JavaScript 允许您使用任意数量的参数调用函数,但如果您想要更严格的东西,可以使用TypeScript。

    它可以防止错误的方法调用和许多其他 JavaScript 愚蠢行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      相关资源
      最近更新 更多