如果我不在 Javascript 函数中传递参数会发生什么?

IT技术 javascript overloading
2021-03-17 00:17:33

我是 Javascript 世界的新手,正在修补编写非常基本的函数,无意中发现了下面的示例,我不确定为什么当函数需要它时我没有传递参数时它会起作用。

示例函数

function myfunction(x) {
    alert("This is a sample alert");
}

现在,如果我调用该函数,则会myfunction();收到警报。为什么我可以在没有传递参数的情况下调用函数而没有任何错误或警告?

编辑

我没想到会有这么多很棒的答案,而且我绝对无法说出哪个答案是最好的,所以我可以要求人们提出最佳答案,然后我将接受该人。

6个回答

什么都不会发生 - 这意味着您不会收到错误或警告,因为在 javascript 中传递参数是可选的。
所有未“提供”的参数都将具有undefined.

function foo(x, y, z){
    //...
}

foo(1);

foo现在函数内部

function foo(x, y, z){
    x === 1
    y === undefined
    z === undefined
}

您甚至可以传递更多参数,例如:

foo(1,2,3,4,5,7); // Valid!

您可以arguments.length从函数内部知道提供的参数数量

function foo(x, y, z) {
    console.log('x value: ' + x);
    console.log('y value: ' + y);
    console.log('z value: ' + z);
    console.log('Arguments length: ' + arguments.length);
}
console.log('Zero parameters');
foo();
console.log('Four parameters');
foo(1, 2, 3, 4);

处理任意数量参数的有用函数示例:

function max() {
    var maxValue = arguments[0];
    for (var i = 1; i < arguments.length; i++) {
        if (maxValue < arguments[i]) {
            maxValue = arguments[i];
        }
    }
    return maxValue;
}

alert(max(1, 5, 7, 2, 88, 32, 44));

@花生猴子。有效的!没有警告没有错误,它甚至很有用,我一会儿给你演示。
2021-04-23 00:17:33
@花生猴子。1.代码return被忽略你就不能拥有代码2.你不会得到错误或警告。看这个演示
2021-04-25 00:17:33
感谢现场演示。没想到有这么多好的答案。因此,如果我有一个函数,例如function myfunction (a,b){}并传递了值 myfunction(1,2,3,4,5),我认为它仍然有效吗?是否期望会有一些警告或错误?
2021-05-05 00:17:33
@花生猴子。如果您安装了开发人员控制台,它也适用于 IE,我认为它是从 IE8+ 默认安装的。我不明白你写的什么alert
2021-05-05 00:17:33
抱歉,您介意详细说明命令的console.log作用以及arguments.length吗?
2021-05-13 00:17:33

JavaScript 函数中的所有参数都是可选的(读作“松散类型”)。

可以使用任意数量的参数调用 JavaScript 函数,而不管函数定义中指定的参数数量。因为函数是松散类型的,它无法声明它期望的参数类型,并且将任何类型的值传递给任何函数都是合法的。当一个函数被调用时的参数少于声明的参数时,额外的参数具有未定义的值。

您可以使用命名参数变量或参数对象在函数内引用函数的参数。此对象包含传递给函数的每个参数的条目,第一个条目的索引从 0 开始。例如,如果一个函数传递了三个参数,则可以按如下方式引用该参数:

arguments[0]
arguments[1]
arguments[2]
  • JavaScript - 权威指南,第 5 版

这就是 JavaScript 的工作原理。参数是可选的,如果函数调用中缺少它们,则函数中将具有非真正值“未定义”的值。

“可选”我的意思是:调用任何函数都涉及任意长的参数列表。传递给函数的参数数量和声明的数量之间不需要有任何关系考虑此声明的最佳方式,然后:

function x(a, b, c) {
  // ...
}

是您声明了一个函数并将名称“a”绑定到第一个参数,将“b”绑定到第二个参数,将“c”绑定到第三个参数。然而,这绝不是保证,在任何给定的函数调用中,这些中的任何一个实际上都会绑定到一个值。

出于同样的原因,您可以定义一个完全不带任何参数的函数,然后通过arguments对象“找到”它们

function noArgs() {
  var a = arguments[0], b = arguments[1], c = arguments[2];
  // ...
}

所以这不是一样的第一个功能,但是它很接近在实际计算方式大多数。

JavaScript 中的“未定义”值是一个值,但随着语言的发展,它的语义有点不寻常。特别是它与null不完全相同此外,“未定义”本身不是关键字;它只是一个半特殊的变量名!

@PeanutsMonkey - 如果没有给出变量,那么它将是undefined.
2021-04-17 00:17:33
@PeanutsMonkey JavaScript 是一种动态语言调用一个函数,该函数的声明并不重要,包括参数的数量。因此,您可以声明具有任意数量参数的函数,但这对调用函数时实际传入的参数数量没有限制。(这样,它有点像 C,至少在过去是 C。)因此,如果您声明一个参数并且在没有提供任何参数值的情况下进行调用,则该参数将是undefined.
2021-05-02 00:17:33
@Pointy - 不能保证任何声明的参数实际上都绑定到一个值是什么意思?
2021-05-05 00:17:33
您能否进一步详细说明您的意思optional以及“不是真正的value”valueundefined
2021-05-14 00:17:33

JavaScript 不像其他语言那样有函数参数的默认值。因此,您可以根据需要传递尽可能多或尽可能少的参数。

如果不传递值,则参数为undefined

function myfunction(x) {
    alert(x);
}

myfunction(); // alerts undefined
myfunction(1); // alerts 1
myfunction(1,2,3); // alerts 1

如果传递的参数多于签名中的参数,则可以使用arguments.

function myfunction(x) {
    alert(x);
    console.log(arguments);
}

myfunction(1,2,3); // alerts 1, logs [1,2,3]
@PeanutsMonkey:它将它记录到您的“JavaScript 控制台”。在大多数浏览器中,您可以按F12Ctrl+Shift+J来访问它。
2021-04-17 00:17:33
@PeanutsMonkey:嗯?你怎么了?
2021-04-28 00:17:33
ES2015开始,第一句话已经过时了......
2021-05-03 00:17:33
本身不是问题。我指的是我向大卫提出的关于传递更多参数的后续问题,这些参数已包含在您的答案中。我不太明白的是你的意思logs它在哪里记录?
2021-05-05 00:17:33
谢谢。而不是交叉发布,你能不能看看我提供给大卫托马斯的例子,因为我仍然得到错误undefined
2021-05-06 00:17:33

您还可以提供比函数中提到的更多的参数

myFunction(1,2,3,4,5,6,7,'etc');

您可以使用arguments数组属性来查看提供的参数。

@albert 参数不是数组,它的数组像对象一样看到
2021-05-12 00:17:33