Javascript 함수에서 매개 변수를 전달하지 않으면 어떻게됩니까?


88

저는 Javascript의 세계에 익숙하지 않고 매우 기본적인 기능을 작성하는 중이며 실수로 아래 예제를 우연히 발견했으며 함수가 요구할 때 매개 변수를 전달하지 않을 때 왜 작동하는지 확신 할 수 없습니다.

샘플 기능

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

이제 함수를 호출 myfunction();하면 경고가 표시됩니다. 매개 변수를 전달하지 않았는데도 오류나 경고없이 함수를 호출 할 수있는 이유는 무엇입니까?

편집하다

나는 그렇게 많은 훌륭한 답변을 기대하지 않았고 나는 결코 어떤 대답이 가장 좋은지 말할 수있는 위치에 있지 않기 때문에 사람들에게 베스트 답변을 제안하도록 요청할 수 있고 그 사람에게 수락을 줄 것입니다.



1
JS의 함수 시그니처를 기반으로하는 오버로딩이 없으므로 함수가 "예상하는"매개 변수 수는 신경 쓰지 않습니다. 함수가 가져 오도록 정의되지 않은 매개 변수를 전달하고 키워드 인수를 사용하여 검색 할 수도 있습니다.
scrappedcola

@scrappedcola-함수가 사용하도록 정의되지 않은 매개 변수를 전달하고 오버로딩한다는 것은 무엇을 의미합니까? 예를 들어 줄 수 있습니까?
PeanutsMonkey

2
@PeanutsMonkey. : 그는 당신은 두 가지 기능을 가질 수 없습니다, 의미 function foo(x){...}function foo(x,y,z){...}각 이름에 대해 하나의 기능을 할 수 있습니다.
gdoron 모니카 지원하고있다

2
@PeanutsMonkey. 예, function overloadingjs에서는 가질 수 없으며 조롱하는 다른 방법이 있습니다.
gdoron 모니카 지원하고있다

답변:


111

아무 일도 일어나지 않습니다. 즉, 자바 스크립트에서 매개 변수를 전달하는 것은 선택 사항이므로 오류나 경고가 표시되지 않습니다.
"제공"되지 않은 모든 매개 변수는 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-The Definitive Guide, 5th Edition

7

이것이 JavaScript가 작동하는 방식입니다. 매개 변수는 선택 사항이며, 함수 호출에서 누락 된 경우 함수에 "정의되지 않은"값이 아닌 값을 갖습니다.

"선택 사항"이란 단지 의미합니다. 함수를 호출 하는 데는 임의로 긴 매개 변수 목록이 포함됩니다. 함수에 전달 된 매개 변수 의 수와 선언 된 수 사이에는 관계가 없어야 합니다. 이 선언을 생각하는 가장 좋은 방법은 다음과 같습니다.

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

함수를 선언하고 이름 "a"를 첫 번째 매개 변수에, "b"를 두 번째 매개 변수에, "c"를 세 번째 매개 변수에 바인딩한다는 것입니다. 그러나 그 중 어느 것이나 나중에 함수의 주어진 호출에서 값에 실제로 바인딩 될 것이라는 보장은 없습니다 .

동일한 토큰으로 매개 변수없이 함수를 정의한 다음 arguments객체 를 통해 "찾을"수 있습니다 .

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

그래서 그것은 첫 번째 기능과 완전히 같지는 않지만 거의 모든면에서 거의 비슷합니다.

자바 스크립트의 "정의되지 않은"값은 값이지만 언어가 진행됨에 따라 의미론은 다소 특이합니다. 특히 null값 과 정확히 동일하지는 않습니다 . 또한 "정의되지 않은"자체는 키워드가 아닙니다. 세미 특수 변수 이름입니다!


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]

감사. 교차 게시하는 대신, 여전히 오류가 발생하므로 David Thomas에게 제공 한 예제를 참조하십시오undefined
PeanutsMonkey

@PeanutsMonkey : 응? 무엇이 문제입니다?
Rocket Hazmat

그 자체로는 문제가되지 않습니다. 답변에 포함 된 더 많은 매개 변수를 전달하는 것에 대해 David에게 후속 질문을 참조했습니다. 내가 잘 따르지 않는 것은 무슨 뜻 logs입니까? 어디에 기록합니까?
PeanutsMonkey

1
@PeanutsMonkey : "JavaScript 콘솔"에 기록합니다. 대부분의 브라우저에서는 누를 수 있습니다 F12또는 Ctrl+Shift+J그것을 얻을 수 있습니다.
Rocket Hazmat 2012-06-19

1
첫 번째 문장은 ES2015 에서 구식입니다 ...
Heretic Monkey

2

함수에 언급 된 것보다 더 많은 인수를 제공 할 수도 있습니다.

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

arguments제공된 인수를보기 위해 배열 인 속성을 사용할 수 있습니다 .


@albert 인수는 객체 참조
Mahi

1

함수가 전달해야하는 매개 변수로 작업 할 수있을 것으로 기대할 때까지 오류가 없기 때문입니다.

예를 들면 :

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

오류가 발생합니다. 아마 NaN(이 경우) 또는 variable is undefined.


좋아요, 함수에서 매개 변수를 참조하지 않는 한 오류가 발생하지 않습니까? 맞습니까?
PeanutsMonkey

이제 예제에 대해 자세히 설명하면 ie를 제공 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(); 

정의되지 않습니다. 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;
    }

함수 내 자바 스크립트 변수의 범위는 블록 수준이 아니라 함수 수준 범위입니다. 예를 들어

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);
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.