O que acontece se eu não passar um parâmetro em uma função Javascript?

88

Eu sou novo no mundo do Javascript e estou tentando escrever funções muito básicas e tropecei no exemplo abaixo por acidente e não tenho certeza de por que funciona quando não estou passando um parâmetro quando a função exige.

Função de amostra

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

Agora, se eu chamar a função, myfunction();o alerta será apresentado. Por que consigo chamar a função sem erros ou avisos quando não passei um parâmetro?

EDITAR

Não esperava tantas respostas boas e não estou de forma alguma em posição de dizer qual é a melhor, então posso pedir às pessoas que sugiram a melhor resposta e concederei a aceitação a essa pessoa.

PeanutsMonkey
fonte
2
Também pode ser útil: developer.mozilla.org/en/JavaScript/Guide/Functions
Felix Kling
1
Não há sobrecarga com base em assinaturas de função em JS, então realmente não importa quantos parâmetros a função "espera". Você pode até mesmo passar parâmetros que a função não está definida para receber e apenas usar os argumentos de palavra-chave para recuperá-los.
scrappedcola
@scrappedcola - O que você quer dizer com sobrecarregar e também passar parâmetros que a função não está definida para assumir? Você pode dar exemplos?
PeanutsMonkey de
2
@PeanutsMonkey. Ele quis dizer, você não pode ter duas funções: function foo(x){...}e function foo(x,y,z){...}você pode ter apenas uma função para cada nome.
gdoron está apoiando Monica em
2
@PeanutsMonkey. Sim, você não pode ter function overloadingno js, ​​mas você tem outras maneiras de zombar dele.
gdoron está apoiando Monica em

Respostas:

111

Nada acontecerá - o que significa que você não receberá um erro ou um aviso, pois passar os parâmetros em javascript é opcional.
Todos os parâmetros que não foram "fornecidos" terão o undefinedvalor .

function foo(x, y, z){
    //...
}

foo(1);

Dentro da foofunção agora:

function foo(x, y, z){
    x === 1
    y === undefined
    z === undefined
}

Você pode ainda passar mais argumentos, como:

foo(1,2,3,4,5,7); // Valid!

Você pode saber a quantidade de parâmetros fornecidos por arguments.lengthdentro da função.

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

Exemplo de função útil que manipula qualquer quantidade de parâmetros:

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

gdoron está apoiando Monica
fonte
Obrigado pela demonstração ao vivo. Não esperava tantas respostas boas. Portanto, se eu tiver uma função como function myfunction (a,b){}e passar os valores para minha função (1,2,3,4,5), considero que ainda é válida? A expectativa é de que haja algum aviso ou erro?
PeanutsMonkey de
Desculpe, você se importaria de explicar o que o comando console.logfaz assim como os argumentos.length?
PeanutsMonkey de
@PeanutsMonkey. Válido! sem aviso nenhum erro, é até útil, darei uma demonstração em um momento.
gdoron está apoiando Monica em
1
@PeanutsMonkey. Funciona com o IE também se você tiver o console do desenvolvedor instalado, acho que é instalado por padrão no IE8 +. Eu não entendi sobre o que você escreveu alert.
gdoron está apoiando Monica em
1
@PeanutsMonkey. 1. Você não pode ter o código depois returnde ser ignorado. 2. você não obterá erros ou avisos. Veja esta DEMO
gdoron está apoiando Monica em
9

Todos os argumentos em funções JavaScript são opcionais (leia-se "digitado livremente").

As funções JavaScript podem ser chamadas com qualquer número de argumentos, independentemente do número de argumentos nomeados na definição da função. Como uma função é digitada livremente, não há como declarar o tipo de argumento que ela espera, e é legal passar valores de qualquer tipo para qualquer função. Quando uma função é chamada com menos argumentos do que os declarados, os argumentos adicionais têm o valor indefinido.

Você pode referir-se aos argumentos de uma função dentro da função usando as variáveis ​​de argumento nomeadas ou o objeto de argumentos. Este objeto contém uma entrada para cada argumento passado para a função, o índice da primeira entrada começando em 0. Por exemplo, se uma função recebe três argumentos, você pode referir-se ao argumento da seguinte maneira:

arguments[0]
arguments[1]
arguments[2]
  • JavaScript - The Definitive Guide, 5th Edition
j08691
fonte
7

É assim que o JavaScript funciona. Os parâmetros são opcionais e terão o valor não realmente um valor "indefinido" na função se eles estiverem ausentes em uma chamada de função.

Por "opcional" quero dizer exatamente isso: invocar qualquer função envolve uma lista arbitrariamente longa de parâmetros. Não é necessário haver relação entre o número de parâmetros passados para uma função e o número declarado . A melhor maneira de pensar nesta declaração, então:

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

é que você está declarando uma função e associando o nome "a" ao primeiro parâmetro, "b" ao segundo e "c" ao terceiro. Não é de forma alguma garantido, no entanto, que qualquer um desses realmente vinculado a um valor em qualquer chamada da função posteriormente.

Do mesmo modo, você pode definir uma função sem nenhum parâmetro e, em seguida, "encontrá-los" por meio do argumentsobjeto:

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

Portanto, não é exatamente o mesmo que a primeira função, mas é semelhante na maioria dos aspectos que contam na prática.

O valor "indefinido" em JavaScript é um valor, mas sua semântica é meio incomum no que diz respeito às linguagens. Em particular, não é exatamente igual ao nullvalor. Além disso, "undefined" em si não é uma palavra-chave; é apenas um nome de variável semi-especial!

Pontudo
fonte
Você poderia explicar melhor o que entende por optionalvalor "não é realmente um valor" undefined?
PeanutsMonkey de
@PeanutsMonkey - Se a variável não for fornecida, será undefined.
Derek 朕 會 功夫
@Pointy - O que você quer dizer com não há garantia de que qualquer um dos parâmetros declarados será realmente vinculado a um valor?
PeanutsMonkey de
1
@PeanutsMonkey JavaScript é uma linguagem dinâmica . Ao chamar uma função, a declaração da função não é importante, incluindo o número de parâmetros. Portanto, você pode declarar uma função com quantos parâmetros desejar, mas isso não impõe restrições sobre quantos parâmetros são realmente passados ​​quando sua função é chamada. (Dessa forma, é mais ou menos como C, pelo menos C nos velhos tempos.) Assim, se você declarar um parâmetro e uma chamada for feita sem nenhum valor de parâmetro fornecido, o parâmetro será undefined.
Pointy de
3

JavaScript não tem valores padrão para parâmetros de função como outras linguagens fazem. Portanto, você pode passar tantos ou tão poucos argumentos quanto quiser.

Se você não passar um valor, o parâmetro é undefined.

function myfunction(x) {
    alert(x);
}

myfunction(); // alerts undefined
myfunction(1); // alerts 1
myfunction(1,2,3); // alerts 1

Se você passar mais parâmetros do que na assinatura, você pode usar arguments.

function myfunction(x) {
    alert(x);
    console.log(arguments);
}

myfunction(1,2,3); // alerts 1, logs [1,2,3]
Foguete Hazmat
fonte
Obrigado. Em vez de postagem cruzada, você pode ver meu exemplo que forneci a David Thomas, pois ainda recebo o erroundefined
PeanutsMonkey
@PeanutsMonkey: Hein? Qual é o seu problema?
Rocket Hazmat de
Não é um problema em si. Eu estava me referindo à minha pergunta de acompanhamento a David sobre passar mais parâmetros que você incluiu em sua resposta. O que eu não entendo é o que você quer dizer com logs? Onde ele registra?
PeanutsMonkey
1
@PeanutsMonkey: Ele o registra em seu "console JavaScript". Na maioria dos navegadores, você pode pressionar F12ou Ctrl+Shift+Jpara acessá-lo.
Foguete Hazmat de
1
A primeira frase está desatualizada em ES2015 ...
Macaco
2

Você também pode fornecer mais argumentos do que apenas aquele mencionado na função

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

Você pode usar a argumentspropriedade que é uma matriz para visualizar os argumentos fornecidos.

AlbertVanHalen
fonte
Argumentos @albert não é array, seu array como o objeto ver
Mahi
1

Porque não há erro até que a função espere poder trabalhar com o parâmetro que você deve passar.

Por exemplo:

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

Iria lançar um erro; embora provavelmente apenas a NaN(neste caso) ou a variable is undefined.

David diz reintegrar Monica
fonte
Ok, contanto que eu não faça referência ao parâmetro na função, não irei obter um erro? Isso está certo?
PeanutsMonkey de
Agora, se eu desenvolver o exemplo que você forneceu ie, function myfunction(a,b) { var calc = a+b; return;}e depois chamar a função, document.write(myfunction(1.2));por que ainda obtenho o valor de undefined, embora esteja passando um parâmetro?
PeanutsMonkey de
1
Porque você não está devolvendo nada. Você deve explicitamente, em seu exemplo, retornar um valor: ou return calc; ou return a+b;(como a última linha, obviamente; e a última returnno lugar dovar calc ).
David diz para restabelecer Monica de
Então você quer dizer que não tenho que declarar uma variável se o fizer return a+b;?
PeanutsMonkey de
@PeanutsMonkey - Você pode ler mais return aqui .
Derek 朕 會 功夫
0

Se você omitir o argumento, seu valor será undefined. Isso permite que você crie parâmetros opcionais com bastante facilidade.

Outra característica é a possibilidade de definir uma função sem parâmetros, e chamá-la com argumentos com sucesso, utilizando o argumentsobjeto. Isso permite que você crie facilmente matrizes de argumentos de comprimento variável.

Kendall Frey
fonte
0

Em javascript console.log dentro de uma função dá undefined como saída para parâmetros não passados, mas fora da função não dá erro definido porque dentro de uma função os navegadores declaram explicitamente a variável. Por exemplo

console.log(x) 

dá VM1533: 1 não capturado ReferenceError: x não está definido, enquanto

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

dá indefinido. É porque a função test () é reescrita pelo navegador como:

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

Outro exemplo : -

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

ainda está indefinido conforme a função se torna

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

O alerta no exemplo abaixo dará indefinido: -

    var x =5;
    function test() {
    alert(x);
    var x =10;
    }

test(); 

A função acima se tornará: -

 function test() {
    var x;
    alert(x);
    x =10;
    }

O escopo da variável javascript dentro de uma função é o escopo no nível da função e não no nível do bloco. Por exemplo

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

dará saída como:

j is 5 
i is 10

Mais uma vez, a função tornou-se como: -

  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);
    }
Goyal Vicky
fonte