What happens if I don't pass a parameter in a Javascript function?

I am new to the world of Javascript and am tinkering with writing very basic functions and stumbled upon the example below by accident and am unsure why it works when I am not passing a parameter when the function demands it.

Sample function

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

Now if I call the function myfunction(); I am presented with the alert. Why is that that I am able to call the function without any errors or warnings when I have not passed a parameter?

EDIT

I did not expect so many great answers and I am by no means in a position yet able to say which answer is the best so am I able to request people to suggest the best answer and I'll award the acceptance to that person.

97462 次浏览

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

我所说的“可选”就是这个意思: 调用 任何函数涉及一个任意长的参数列表。函数的参数 通过了的数目和 声明的数目之间不需要有任何关系。那么,最好的办法就是:

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

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

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

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

所以 quite和第一个函数不一样,但是在大多数实际计数的方法中都很接近。

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

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

JavaScript functions can be invoked with any number of arguments, 无论函数中命名的参数数目如何 因为一个函数是松散类型的,所以没有办法 它声明它所期望的参数的类型,并且声明它所期望的参数的类型是合法的 将任何类型的值传递给任何函数。如果调用的函数的参数少于声明的参数,则附加参数具有未定义的值。

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

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

因为在函数能够处理要传递的参数之前不会出现错误。

例如:

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

将抛出一个错误; 尽管可能只有 NaN(在本例中)或 variable is undefined

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

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]

You can also provide more arguments than just the one mentioned in the function

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

You can use the arguments property which is an array in order to view the provided arguments.

如果省略该参数,它的值将是 undefined。这使您可以很容易地创建可选参数。

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

In javascript console.log inside a function gives undefined as output for unpassed parameters but outside the function it gives not defined error as inside a function browsers explicitly declares the variable. For e.g

console.log(x)

给出 VM1533:1未捕获的参考错误: x 没有定义,而

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

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

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

Another Example : -

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

The above function will become :-

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

will give output as :

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