Що станеться, якщо я не передаю параметр у функції Javascript?


88

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

Функція зразка

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

Тепер, якщо я зателефоную до функції, myfunction();я отримаю попередження. Чому саме через те, що я не передав параметр, я можу викликати функцію без помилок або попереджень?

РЕДАГУВАТИ

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


2
Також може бути корисним: developer.mozilla.org/en/JavaScript/Guide/Functions
Фелікс Клінг

1
У JS немає перевантаження, заснованого на підписах функцій, тому насправді байдуже, скільки параметрів функція "очікує". Ви навіть можете передати параметри, які не визначено для функції, і просто використовувати аргументи ключового слова для їх отримання.
скрапкола

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

2
@PeanutsMonkey. Він мав на увазі, що ви не можете мати дві функції: function foo(x){...}і function foo(x,y,z){...}ви можете мати лише одну функцію для кожного імені.
gdoron підтримує Моніку

2
@PeanutsMonkey. Так, ви не можете мати function overloadingjs, у вас є інші способи, як знущатися над ним.
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робить команда , а також аргументи. Довжина?
PeanutsMonkey

@PeanutsMonkey. Дійсно! без попередження, без помилок, це буде навіть корисно, я за хвилину дам вам демонстрацію.
gdoron підтримує Моніку

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

1
@PeanutsMonkey. 1. Ви не можете мати код після returnйого ігнорування. 2. Ви не отримаєте помилок або попереджень. Дивіться це DEMO
gdoron підтримує Моніку

9

Усі аргументи у функціях JavaScript є необов'язковими (читайте "вільно введено").

Функції JavaScript можна викликати з будь-якою кількістю аргументів, незалежно від кількості аргументів, названих у визначенні функції. Оскільки функція вільно набрана, вона не може оголосити тип аргументів, який вона очікує, і законно передавати значення будь-якого типу будь-якій функції. Коли функція викликається з меншою кількістю аргументів, ніж оголошено, додаткові аргументи мають невизначене значення.

Ви можете посилатися на аргументи функції всередині функції, використовуючи іменовані змінні аргументу або об'єкт аргументів. Цей об'єкт містить запис для кожного аргументу, переданого функції, індекс першого запису починається з 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значення. Крім того, сам "undefined" не є ключовим словом; це просто напівспеціальна назва змінної!


Чи не могли б Ви детальніше пояснити, що Ви маєте на увазі, optionalа також значення "не зовсім цінності" undefined?
PeanutsMonkey

@PeanutsMonkey - Якщо змінної не вказано, тоді вона буде undefined.
Дерек 朕 會 功夫

@Pointy - Що ви маєте на увазі, не маючи гарантії, що будь-який із заявлених параметрів насправді буде прив'язаний до значення?
PeanutsMonkey

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

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: Так? У чому проблема?
Racket Hazmat

Не проблема як така. Я мав на увазі своє подальше запитання до Девіда щодо передачі більше параметрів, які ви включили у свою відповідь. Чого я не зовсім дотримуюся, так це те, що ви маєте на увазі logs? Де це реєструє?
PeanutsMonkey

1
@PeanutsMonkey: Він реєструє його на "консолі JavaScript". У більшості браузерів ви можете натиснути F12або, Ctrl+Shift+Jщоб перейти до нього.
Racket Hazmat

1
Перше речення застаріло станом на ES2015 ...
Єретична мавпа

2

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

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

Ви можете використовувати argumentsвластивість, що є масивом, для перегляду наданих аргументів.


Аргументи @albert - це не масив його масиву, як об’єкт див.
Махі

1

Оскільки помилок немає, поки функція не очікує можливості працювати з параметром, який ви повинні передати.

Наприклад:

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

Викине помилку; хоча, ймовірно, лише a NaN(у даному випадку) або a 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 тут .
Дерек 朕 會 功夫

0

Якщо аргумент опустити, його значення буде undefined. Це дозволяє досить легко створювати додаткові параметри.

Іншою особливістю є можливість визначити функцію без параметрів та успішно викликати її з аргументами, використовуючи argumentsоб’єкт. Це дозволяє легко створювати масиви аргументів змінної довжини.


0

У javascript console.log всередині функція видає невизначений як вихід для непройдених параметрів, але поза функцією вона видає невизначену помилку, оскільки всередині функції браузери явно оголошують змінну. Наприклад,

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);
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.