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

时间:2012-06-19 19:16:42

标签: javascript overloading

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

示例功能

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

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

修改

我没想到会有这么多很棒的答案而且我决不能说出哪个答案是最好的,所以我能够要求人们提出最佳答案,我会给予答案。人。

8 个答案:

答案 0 :(得分:89)

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

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

答案 1 :(得分:8)

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

  

可以使用任意数量的参数调用JavaScript函数,   无论函数中指定的参数数量是多少   定义。因为函数是松散类型的,所以没有办法   它声明了它所期望的参数类型,这是合法的   将任何类型的值传递给任何函数。当使用少于声明的参数调用函数时,附加参数具有未定义的值。

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

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

答案 2 :(得分:6)

这就是JavaScript的工作原理。参数是可选的,如果函数调用中缺少参数,则函数中的not-really-a值将为“undefined”。

“可选”我的意思是:调用任何函数涉及一个任意长的参数列表。参数传递到函数的数量与声明的数量之间没有关系。想到这个宣言的最佳方式是:

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

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

出于同样的原因,你可以定义一个没有任何参数的函数,然后通过arguments对象“找到”它们:

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

所以这不是完全与第一个函数相同,但它在大多数方面都接近实际计算。

JavaScript中的“未定义”值是一个值,但它的语义与语言一样不同寻常。特别是它与null值不完全相同。另外,“undefined”本身不是关键字;它只是一个半特殊的变量名称!

答案 3 :(得分:2)

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]

答案 4 :(得分:1)

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

例如:

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

会抛出错误;虽然可能只有NaN(在这种情况下)或variable is undefined

答案 5 :(得分:1)

您还可以提供更多参数,而不仅仅是函数

中提到的参数
myFunction(1,2,3,4,5,6,7,'etc');

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

答案 6 :(得分:0)

如果省略参数,其值将为undefined。这使您可以非常轻松地创建可选参数。

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

答案 7 :(得分:0)

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

console.log(x) 

给出VM1533:1未捕获的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);
    }