Что произойдет, если я не передам параметр в функции Javascript?


88

Я новичок в мире Javascript и пытаюсь написать очень простые функции, случайно наткнулся на приведенный ниже пример и не уверен, почему он работает, когда я не передаю параметр, когда этого требует функция.

Пример функции

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

Теперь, если я вызываю функцию, myfunction();мне выдается предупреждение. Почему я могу вызвать функцию без ошибок или предупреждений, если я не передал параметр?

РЕДАКТИРОВАТЬ

Я не ожидал так много хороших ответов, и я ни в коем случае не в состоянии сказать, какой ответ лучший, поэтому могу ли я попросить людей предложить лучший ответ, и я награжу его принятием.


2
Также может быть полезно: developer.mozilla.org/en/JavaScript/Guide/Functions
Феликс Клинг,

1
В JS нет перегрузки, основанной на сигнатурах функций, поэтому на самом деле не важно, сколько параметров функция «ожидает». Вы даже можете передать параметры, которые функция не должна принимать, и просто использовать аргументы ключевого слова для их получения.
scrappedcola

@scrappedcola - Что вы имеете в виду под перегрузкой и передачей параметров, которые функция не определена для приема? Можете привести примеры?
PeanutsMonkey

2
@PeanutsMonkey. Он имел в виду, что у вас не может быть двух функций: function foo(x){...}и у function foo(x,y,z){...}вас может быть только одна функция для каждого имени.
gdoron поддерживает Монику

2
@PeanutsMonkey. Да, function overloadingв js не может быть , но есть и другие способы поиздеваться над ним.
gdoron поддерживает Монику

Ответы:


111

Ничего не произойдет - это означает, что вы не получите сообщение об ошибке или предупреждение, так как передача параметров в javascript является необязательной.
Все параметры, которые не были «предоставлены», будут иметь undefinedзначение .

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

Извините, не могли бы вы уточнить, что console.logделает команда , а также arguments.length?
PeanutsMonkey

@PeanutsMonkey. Действует! никаких предупреждений нет ошибок, это даже полезно, я дам вам демо через мгновение.
gdoron поддерживает Монику

1
@PeanutsMonkey. Он также работает с IE, если у вас установлена ​​консоль разработчика, я думаю, она устанавливается по умолчанию из IE8 +. Я не понял, о чем вы написали alert.
gdoron поддерживает Монику

1
@PeanutsMonkey. 1. У вас не может быть кода после returnтого, как он проигнорирован. 2. вы не получите ошибок или предупреждений. Смотрите это ДЕМО
gdoron поддерживает Монику

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];
  // ...
}

Так что это не совсем то же самое, что и первая функция, но во многих смыслах она близка.

Значение «undefined» в JavaScript - это значение, но его семантика довольно необычна для языков. В частности, это не совсем то же самое, что и nullзначение. Кроме того, «undefined» само по себе не является ключевым словом; это просто полу-специальное имя переменной!


Не могли бы вы подробнее пояснить, что вы подразумеваете под optional«не совсем ценностью» undefined?
PeanutsMonkey

@PeanutsMonkey - Если переменная не указана, то будет undefined.
Derek 朕 會 功夫

@Pointy - Что вы имеете в виду, говоря, что нет гарантии, что какой-либо из объявленных параметров будет фактически привязан к значению?
PeanutsMonkey

1
@PeanutsMonkey JavaScript - это динамический язык . При вызове функции не важно объявление функции, включая количество параметров. Таким образом, вы можете объявить функцию с любым количеством параметров, но это не налагает ограничений на то, сколько параметров фактически передается при вызове вашей функции. (В этом смысле это что-то вроде C, по крайней мере, C в прежние времена.) Таким образом, если вы объявляете параметр, и вызов выполняется без какого-либо значения параметра, параметр будет undefined.
Pointy

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]

Спасибо. Вместо перекрестной публикации, можете ли вы увидеть мой пример, который я предоставил Дэвиду Томасу, поскольку я все еще получаю сообщение об ошибкеundefined
PeanutsMonkey

@PeanutsMonkey: А? В чем твоя проблема?
Rocket Hazmat

Само по себе это не проблема. Я имел в виду свой следующий вопрос Дэвиду о передаче дополнительных параметров, которые вы включили в свой ответ. Я не совсем понимаю, что вы имеете в виду logs? Где это регистрируется?
PeanutsMonkey

1
@PeanutsMonkey: он записывает его в вашу «консоль JavaScript». В большинстве браузеров вы можете нажать F12или, Ctrl+Shift+Jчтобы перейти к нему.
Rocket Hazmat

1
Первое предложение устарело по состоянию на ES2015 ...
Heretic Monkey

2

Вы также можете предоставить больше аргументов, чем только тот, который указан в функции

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

Вы можете использовать argumentsсвойство, которое представляет собой массив, чтобы просмотреть предоставленные аргументы.


@albert arguments не является массивом, его массив, как объект, см.
Махи

1

Потому что ошибки не возникает, пока функция не ожидает, что сможет работать с параметром, который вы должны передать.

Например:

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

Выдает ошибку; хотя, вероятно, только NaN(в данном случае) или variable is undefined.


Хорошо, если я не буду ссылаться на параметр в функции, я не получу сообщение об ошибке? Это правильно?
PeanutsMonkey

Теперь, если я подробно остановлюсь на примере, который вы предоставили, то есть, function myfunction(a,b) { var calc = a+b; return;}а затем вызову функцию, document.write(myfunction(1.2));почему я все еще получаю значение, undefinedдаже если я передаю параметр?
PeanutsMonkey

1
Потому что ты ничего не возвращаешь. В вашем примере вы должны явно вернуть значение: либо return calc; или return a+b;(как последняя строка, очевидно, и последняя returnвместо var calc).
Дэвид требует восстановить Монику на работе

Значит, вы имеете в виду, что мне не нужно объявлять переменную, если я это сделаю return a+b;?
PeanutsMonkey

@PeanutsMonkey - Вы можете узнать больше return здесь .
Derek 朕 會 功夫

0

Если вы опустите аргумент, его значение будет undefined . Это позволяет довольно легко создавать необязательные параметры.

Еще одна особенность - это возможность определять функцию без параметров и успешно вызывать ее с аргументами, используя argumentsобъект. Это позволяет легко создавать массивы аргументов переменной длины.


0

В javascript console.log внутри функции выдает undefined в качестве вывода для непроходящих параметров, но вне функции он дает неопределенную ошибку, поскольку внутри функции браузеры явно объявляют переменную. Например,

console.log(x) 

дает VM1533: 1 Uncaught ReferenceError: x не определен, тогда как

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

дает undefined. Это потому, что функция 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)
    }

В предупреждении в приведенном ниже примере будет указано значение undefined: -

    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);
    }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.