자바 스크립트 중첩 함수


97

내가 이해하지 못하는 자바 스크립트 코드가 있습니다.

function dmy(d) {
    function pad2(n) {
        return (n < 10) ? '0' + n : n;
    }

    return pad2(d.getUTCDate()) + '/' +
       pad2(d.getUTCMonth() + 1) + '/' +
       d.getUTCFullYear();
}

function outerFunc(base) {
    var punc = "!";

    //inner function
    function returnString(ext) {
       return base + ext + punc;
    }

    return returnString;
}

다른 함수 내에서 함수를 어떻게 정의 할 수 있습니까? my () 함수 외부에서 pad2 ()를 호출 할 수 있습니까?

불 좀 켜주세요. 감사


13
함수 내부에 함수를 만들 수 있습니다. 그것은 완벽하게 유효합니다.
0x499602D2 2011 년

답변:


140

함수는 JavaScript의 또 다른 유형의 변수입니다 (물론 약간의 뉘앙스 포함). 다른 함수 내에서 함수를 만들면 변수의 범위를 변경하는 것과 같은 방식으로 함수의 범위가 변경됩니다. 이는 전체 글로벌 네임 스페이스 오염을 줄이기 위해 클로저와 함께 사용하는 데 특히 중요합니다.

다른 함수 내에 정의 된 함수는 함수 외부에서 액세스 할 수있는 객체에 연결되어 있지 않으면 함수 외부에서 액세스 할 수 없습니다.

function foo(doBar)
{
  function bar()
  {
    console.log( 'bar' );
  }

  function baz()
  {
    console.log( 'baz' );
  }

  window.baz = baz;
  if ( doBar ) bar();
}

이 예에서 baz 함수는 foo함수가 재정의되었으므로 함수가 실행 된 후에 사용할 수 있습니다 window.baz. bar 함수는 foo함수 내에 포함 된 범위 이외의 컨텍스트에서 사용할 수 없습니다 .

다른 예로서 :

function Fizz(qux)
{
  this.buzz = function(){
    console.log( qux );
  };
}

Fizz기능을 실행하면, 그것은 할당하도록 생성자로 설계 buzz새로 만든 객체에 기능을.


window.baz = baz는 무엇입니까? 이 라인 m? ke baz를 사용할 수있는 이유는 무엇입니까?
Ziyang Zhang

@ZiyangZhang, 그 코드 블록 다음의 단락에 설명이 있는데, 명확하지 않은 부분이 있었나요?
zzzzBov

35

폐쇄 라고 합니다.

기본적으로 다른 함수 내에 정의 된 함수는이 함수 내에서만 액세스 할 수 있습니다. 그러나 결과로 전달되고이 결과가 호출 될 수 있습니다.

매우 강력한 기능입니다. 여기에서 자세한 설명을 볼 수 있습니다.

Archive.org의 javascript_closures_for_dummies.html 미러


13
function x() {}

다음과 동등하거나 매우 유사합니다.

var x = function() {}

내가 착각하지 않는 한.

그래서 재미있는 일은 없습니다.


8
첫 번째 구문은 문서의 시작 부분으로 이동합니다. 따라서 함수가 초기화되기 전에 'x'함수를 호출 할 수 있습니다.
Tom

10
첫 번째 구문은 또한 명명 된 함수로 훨씬 더 멋진 스택 추적을 제공하고 두 번째 구문은 두통을 줄 것입니다
TheZ

@TheZ 나는 Chrome이 최근 디버깅에 함수 이름 추론을 추가했다고 생각하므로 일반적인 경우와 같은 두통이 발생하지 않습니다.
jinglesthula

@jinglesthula 예! Chrome은이 이름 추론을 얼마 전에 추가했으며 대단히 감사합니다. :)
TheZ

10

함수 내부 및 외부에서 함수 인스턴스화가 허용됩니다. 이러한 함수 내에서 변수와 마찬가지로 중첩 함수는 로컬이므로 외부 범위에서 가져올 수 없습니다.

function foo() {
    function bar() {
        return 1;
    }
    return bar();
}

foobar그 자체로 조작 합니다. bar외부 범위에 정의되어 있지 않으면 외부 범위에서 건드릴 수 없습니다.

따라서 이것은 작동하지 않습니다.

function foo() {
    function bar() {
        return 1;
    }
}

bar(); // throws error: bar is not defined

4

함수 내에서 함수를 선언하면 내부 함수는 선언 된 범위에서만 사용할 수 있습니다. 또는 귀하의 경우 pad2에는dmy 범위 .

에 존재하는 모든 변수 dmy는에서 볼 수 pad2있지만 다른 방식으로는 발생하지 않습니다. : D


2

자바 스크립트 (및 많은 언어)에서 함수 내부에 함수를 갖는 것은 완벽하게 정상입니다.

시간을내어 언어를 배우십시오. 이미 알고있는 것과 유사하다는 근거로 사용하지 마십시오. Act III : Function the Ultimate (비디오 다운로드, 슬라이드 및 대본 링크) 에 특별히 초점을 맞춘 Javascript에 대한 Douglas Crockford의 YUI 프레젠테이션 시리즈를 시청하는 것이 좋습니다 .


0

function foo() {
  function bar() {
    return 1;
  }
}
bar();

오류가 발생합니다. bar내부 foo에 정의되어 있으므로 내부 bar에서만 액세스 할 수 있습니다 foo.
사용하려면 bar내부에서 실행해야합니다 foo.

function foo() {
  function bar() {
    return 1;
  }
  bar();
}

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