105

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

示例函数

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

现在,如果我调用该函数myfunction();,我会收到警报。为什么当我没有传递参数时,我能够调用函数而没有任何错误或警告?

编辑

我没想到会有这么多很棒的答案,而且我还无法说出哪个答案是最好的,所以我可以要求人们提出最佳答案,我会将接受权授予那个人。

4

8 回答 8

128

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

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));

于 2012-06-19T19:19:18.267 回答
10

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

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

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

arguments[0]
arguments[1]
arguments[2]
  • JavaScript - 权威指南,第 5 版
于 2012-06-19T19:19:01.183 回答
7

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

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

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

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

同理,你可以定义一个完全不带任何参数的函数,然后通过arguments对象“找到”它们:

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

所以这与第一个函数不太一样,但它在大多数实际计算的方面都很接近。

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

于 2012-06-19T19:19:00.053 回答
4

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]
于 2012-06-19T19:20:07.803 回答
2

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

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

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

于 2012-06-19T19:21:54.323 回答
1

因为在函数期望能够使用您应该传递的参数之前没有错误。

例如:

function myfunction(x) {
    return x*2;
}

会抛出错误;尽管可能只有一个NaN(在这种情况下)或一个variable is undefined.

于 2012-06-19T19:19:08.867 回答
0

如果省略参数,则其值为undefined. 这使您可以很容易地创建可选参数。

另一个特点是能够定义一个不带参数的函数,并使用arguments对象成功调用它。这使您可以轻松地创建可变长度参数数组。

于 2012-06-19T19:23:39.730 回答
0

在 javascript console.log 中,函数内部给出未定义作为未传递参数的输出,但在函数外部它给出未定义错误,因为函数内部浏览器显式声明了变量。例如

console.log(x) 

给出 VM1533:1 Uncaught ReferenceError: x is not defined 而

function test(x) {
console.log(x)
}
test(); 

给出未定义的。这是因为函数 test() 被浏览器重写为:

function test(x) {
    var x;
    console.log(x)
    }

另一个例子 : -

var x =5 ;
function test(x) {
console.log(x)
}
test(); 

随着函数变为未定义

function test(x) {
    var x;
    console.log(x)
    }

以下示例中的警报将给出未定义的:-

    var x =5;
    function test() {
    alert(x);
    var x =10;
    }

test(); 

上述函数将变为:-

 function test() {
    var x;
    alert(x);
    x =10;
    }

函数内 javascript 变量的范围是函数级范围,而不是块级。例如

function varScope() {

for(var i = 0; i < 10; i++){
    for(var j = 0; j < 5; j++){}
        console.log("j is "+j)
    }
    console.log("i is "+i);


}
varScope();

将输出为:

j is 5 
i is 10

功能再次变为:-

  function varScope() {
    var i;
    var j;
    for(i = 0; i < 10; i++){
        for(j = 0; j < 5; j++){}
            console.log("j is "+j)
        }
        console.log("i is "+i);
    }
于 2019-12-23T07:28:47.517 回答