如果我没有在Javascript函数中传递参数会怎样?


88

我是Java语言的新手,正在尝试编写非常基本的函数,偶然偶然发现了以下示例,并且不确定为什么当我在函数要求时不传递参数时,它为什么可以工作。

样例功能

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

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

编辑

我没想到会有这么多好答案,而且我现在还无法说出哪个答案是最好的,所以我可以要求人们提出最好的答案,然后我会接受那个人。



1
JS中没有基于函数签名的重载,因此它实际上不在乎函数“期望”多少个参数。您甚至可以传递未定义该函数采用的参数,而仅使用关键字参数来检索它们。
scrappedcola 2012年

@scrappedcola-重载以及传递未定义函数要接受的参数是什么意思?你能举个例子吗?
PeanutsMonkey,2012年

2
@PeanutsMonkey。他的意思是,你不能有两个功能:function foo(x){...}function foo(x,y,z){...}你只能有一个每个名字的功能。
gdoron支持Monica 2012年

2
@PeanutsMonkey。是的,您无法使用function overloadingjs,但可以通过其他方法来模拟它。
gdoron支持Monica 2012年

Answers:


111

什么都不会发生-这意味着您不会收到错误或警告,因为在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));


感谢现场演示。没想到有这么多好的答案。因此,如果我有一个诸如的函数function myfunction (a,b){}并传递了myfunction(1,2,3,4,5)值,那么我认为它仍然有效吗?是否期望会有一些警告或错误?
PeanutsMonkey,2012年

抱歉,您介意详细说明该命令的console.log功能以及arguments.length吗?
PeanutsMonkey,2012年

@PeanutsMonkey。有效!没有警告,没有错误,它甚至很有用,我稍后会给您演示。
gdoron支持Monica 2012年

1
@PeanutsMonkey。如果您已经安装了开发人员控制台,它也可以与IE一起使用,我认为它默认是从IE8 +安装的。我不明白你写了什么alert
gdoron支持Monica 2012年

1
@PeanutsMonkey。1.return被忽略后,您将无法获得代码。2.您不会收到错误或警告。看到这个演示
gdoron支持Monica 2012年

9

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

可以使用任意数量的参数调用JavaScript函数,而不管函数定义中命名的参数数量如何。由于函数是松散类型的,因此无法声明其期望的参数类型,并且将任何类型的值传递给任何函数是合法的。当使用少于声明的参数调用函数时,其他参数具有未定义的值。

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

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

7

这就是JavaScript的工作方式。参数是可选的,如果函数调用中缺少参数,则该参数在函数中将具有非真正值“ undefined”。

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

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

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

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

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

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

JavaScript中的“未定义”值是一个值,但是它的语义随着语言的发展而有所不同。特别是它与null值并不完全相同。同样,“未定义”本身也不是关键字。这只是一个半特殊的变量名!


您能否进一步说明optional“不是真的值”的意思是什么undefined
PeanutsMonkey,2012年

@PeanutsMonkey-如果未指定变量,则为undefined
德里克·朕会功夫2012年

@Pointy-您是什么意思,不能保证任何已声明的参数都会实际绑定到值?
PeanutsMonkey,2012年

1
@PeanutsMonkey JavaScript是一种动态语言。当调用一个函数,该函数的声明并不重要,包括参数的数量。因此,您可以使用任意数量的参数声明一个函数,但这对调用函数时实际传递的参数没有限制。(以这种方式,它类似于C,过去至少是C。)因此,如果声明一个参数并且在没有提供任何参数值的情况下进行调用,则参数将为undefined
Pointy 2012年

3

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]

谢谢。除了交叉发布,您还可以查看我提供给David Thomas的示例,因为我仍然遇到错误undefined
PeanutsMonkey 2012年

@PeanutsMonkey:嗯?你怎么了?
火箭Hazmat 2012年

本身不是问题。我指的是我向David提出的后续问题,关于传递更多包含在答案中的参数。我不太明白您的意思是什么logs?它记录在哪里?
PeanutsMonkey 2012年

1
@PeanutsMonkey:它将其记录到“ JavaScript控制台”。在大多数浏览器中,您可以按F12Ctrl+Shift+J进入。
火箭Hazmat 2012年

1
ES2015起,第一句话已经过时了……
异端猴子

2

除了函数中提到的参数外,您还可以提供更多的参数

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

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


@albert参数不是数组,其数组类似于对象,请参见
Mahi

1

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

例如:

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

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


好的,只要我不在函数中引用参数,就不会收到错误消息?那正确吗?
PeanutsMonkey,2012年

现在,如果我详细说明您提供的示例function myfunction(a,b) { var calc = a+b; return;},然后调用该函数document.write(myfunction(1.2));undefined即使我传递了一个参数,为什么我仍然得到的值?
PeanutsMonkey 2012年

1
因为你什么也没退。在您的示例中,您必须显式地返回一个值:或者 return calc;return a+b;(很显然,最后一行return代替var calc)。
大卫说恢复莫妮卡(Monica)2012年

所以,您的意思是说,我不必声明变量return a+b;吗?
PeanutsMonkey,2012年

@PeanutsMonkey-您可以在return 此处了解更多信息
德里克·朕会功夫2012年

0

如果省略该参数,则其值为undefined。这使您可以轻松创建可选参数。

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


0

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

console.log(x) 

给出VM1533:1 Uncaught ReferenceError:x未定义,而

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);
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.