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

Posted

技术标签:

【中文标题】如果我不在 Javascript 函数中传递参数会怎样?【英文标题】:What happens if I don't pass a parameter in a Javascript function? 【发布时间】:2012-06-21 21:31:45 【问题描述】:

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

示例函数

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

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

编辑

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

【问题讨论】:

可能也有帮助:developer.mozilla.org/en/JavaScript/Guide/Functions 在 JS 中没有基于函数签名的重载,所以它真的不关心函数“期望”多少参数。您甚至可以传入该函数未定义为采用的参数,然后使用关键字参数来检索它们。 @scrappedcola - 重载和传入函数未定义为采用的参数是什么意思?能举个例子吗? @PeanutsMonkey。他的意思是,你不能有两个函数:function foo(x)...function foo(x,y,z)... 每个名字只能有一个函数。 @PeanutsMonkey。是的,你不能在 js 中使用 function overloading,尽管你有其他方法可以模拟它。 【参考方案1】:

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

【讨论】:

感谢现场演示。没想到这么多好答案。因此,如果我有一个诸如function myfunction (a,b) 之类的函数并传递了值 myfunction(1,2,3,4,5),我认为它仍然有效吗?预期会有一些警告或错误吗? 抱歉,您介意详细说明命令 console.log 和 arguments.length 的作用吗? @PeanutsMonkey。有效的!没有警告没有错误,它甚至很有用,我马上给你一个演示。 @PeanutsMonkey。如果您安装了开发人员控制台,它也适用于 IE,我认为它默认是从 IE8+ 安装的。我不明白你写的关于alert 的内容。 @PeanutsMonkey。 1. return 之后的代码将被忽略。 2. 您不会收到错误或警告。 See this DEMO【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

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

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

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 - 如果没有给出变量,那么它将是undefined @Pointy - 不能保证任何声明的参数都将实际绑定到一个值是什么意思? @PeanutsMonkey JavaScript 是一种动态语言调用函数时,函数的声明并不重要,包括参数的个数。因此,您可以声明一个带有任意数量参数的函数,但这对调用函数时实际传入的参数数量没有限制。 (这样,它有点像 C,至少在过去是 C。)因此,如果您声明一个参数并且在没有提供任何参数值的情况下进行调用,则该参数将为 undefined【参考方案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]

【讨论】:

谢谢。而不是交叉发布,你能不能看看我提供给大卫托马斯的例子,因为我仍然收到错误undefined @PeanutsMonkey:嗯?你有什么问题? 本身不是问题。我指的是我对大卫的后续问题,关于传递您在答案中包含的更多参数。我不太明白你所说的logs 是什么意思?它在哪里记录? @PeanutsMonkey:它将它记录到您的“JavaScript 控制台”。在大多数浏览器中,您可以按F12Ctrl+Shift+J 来访问它。 第一句截至ES2015...已过时【参考方案5】:

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

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

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

【讨论】:

@albert 参数不是数组,它的数组类似于对象see【参考方案6】:

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

例如:

function myfunction(x) 
    return x*2;

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

【讨论】:

好的,只要不引用函数中的参数,就不会报错?对吗? 现在,如果我详细说明您提供的示例,即function myfunction(a,b) var calc = a+b; return;,然后调用函数document.write(myfunction(1.2));,为什么即使我传递了一个参数,我仍然得到undefined 的值? 因为你没有返回任何东西。在您的示例中,您必须明确地返回一个值:either return calc;return a+b; (显然,作为最后一行;后者 return 代替 var calc) . 所以你的意思是我不需要声明变量return a+b;? @PeanutsMonkey - 您可以在 return here 上阅读更多内容。【参考方案7】:

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

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

【讨论】:

【参考方案8】:

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

【讨论】:

以上是关于如果我不在 Javascript 函数中传递参数会怎样?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript的参数详解

为啥将 ClientID 传递给 javascript 函数会传递整个控件?

JavaScript函数式编程:函数基础 argumentsthisapply()call()

理解JavaScript函数参数

javascript 函数作为参数名

JavaScript 函数参数