2012-04-27 2 views
6

자바 스크립트에서 네임 스페이스와 클로저의 차이점은 무엇입니까? 그들은 나에게 매우 흡사하게 보입니다.자바 스크립트 - 네임 스페이스와 클로저의 차이점은 무엇입니까?

EDIT 우리는 여전히 우리가 변수를 선언 할 볼 수있는 곳 상황을 할거야,

특히, this article 네임 스페이스와 클로저를 설명하고 지금

같은 문장을 가지고 그 돈 이름 공간이있는 객체에 자연스럽게 딱 들어 맞습니다. 구조체. 그러나 우리는 이러한 변수가 글로벌 범위를 가지길 원치 않습니다. 이것은 자체 호출 함수가 들어오는 곳입니다.

"객체 네임 스페이스"와 같이 클로저처럼 보입니다. 나에게 네임 스페이스가 closure 인 것처럼 보이지만 ... 그렇지 않을 수도 있습니다 ...? 도움?

+1

"네임 스페이스"정의에 대해 자세히 설명하십시오. –

+0

자바 스크립트에 네임 스페이스가 없습니다. 그 용어로 무엇을 의미합니까? –

+1

자바 스크립트에는 "네임 스페이스"라는 의미가 없습니다. 왜냐하면 기호를 공백으로 구분하는 작업 (클로저 포함)을 수행하는 여러 가지 방법이 있기 때문입니다. 몇 가지 코드를 보여주십시오. –

답변

23

네임 스페이스는 기본적으로 당신이 그렇게 비슷한 및/또는 범위 주위를 실행 충돌하는 이름을 가진 변수의 무리가 없습니다에 물건을 밀어없는 흥미로운 성질을 가진 Object입니다. 그래서,

MyNS = {} 
MyNS.x = 2 
MyNS.func = function() { return 7; } 

같은 예를 들어, 어떤 함수는 그 변수가 범위를 벗어나 갔다하더라도, 그것은에 정의되지 않은 변수의 값을 '유지'A 폐쇄 될 때. 다음 가지고 : 나는 c = makeCounter()을 할 경우

function makeCounter() { 
    var x = 0; 
    return function() { return x++; } 
} 

다음 반복 c() 전화, 나는 0, 1, 2, 3, ...를 얻을 수 있습니다. x이 범위를 벗어 났음에도 불구하고 makeCounter이라는 내부 익명 함수의 범위가 x을 '닫음'으로 정의하므로이 함수에 대한 참조가 있기 때문입니다. 그때 할 경우

특히, d = makeCounter(), d()cdx의 다른 인스턴스를 얻을 수 있기 때문입니다 0부터 카운트가 시작됩니다.http://jibbering.com/faq/notes/closures/ 가입일

+0

이것은 정말 좋은 답변입니다 - 감사합니다! 그걸로 시간을 좀 줄께 :) – Ben

+0

+1 마침내 클로저를 이해합니다 (그리고 2-3 자습서를 시도하고 항상 포기했습니다) – ajax333221

+0

그래, 이건 내가 본 클로저의 가장 간결하고 도움이되는 설명이다 - 고마워! 이제 알겠다. – iono

5

일반적으로 네임 스페이스는 모든 전역 변수를 하나의 마스터 전역 변수 아래에 속성으로 두는 방법이므로 새로운 진정한 최상위 글로벌 변수 하나만 추가하십시오. 전역 네임 스페이스의 오염을 방지하고 다른 전역 변수와의 충돌 가능성을 줄입니다. 네임 스페이스의

예 :

var YUI = {}; 
YUI.one = function(sel) {...}; 
YUI.two = function(sel) {...}; 
YUI.three = function(sel) {...}; 

최상위 글로벌 네임 스페이스 YUI에서 하나 개의 새로운 항목이 있습니다 만, 유이 공간 객체를 통해 여러 전역으로 액세스 할 항목이 있습니다.

클로저는 함수의 내부 부분에 대한 지속적인 참조로 인해 함수 실행의 정상적인 종료를 초과하여 지속되는 함수 블록입니다.

function doSometing() { 
    var x = 10; 
    setTimer(function() { 
     // this gets called after doSomething() has finished executing 
     // but because of the function closure, the variables 
     // inside of the parent scope like x are still accessible 
     x += 10; 
    }, 1000); 
} 
2

: 클로저가 함수 호출에서 함수 호출의 실행 컨텍스트 내에서 생성 된 함수 객체를 리턴하고 서로의 특성에 해당 내부 기능에 대한 참조를 지정함으로써 형성된다

목적. 또는 예를 들어 전역 변수, 전역 적으로 액세스 가능한 객체의 속성 또는 외부 함수 호출에 대한 인수로 참조로 전달 된 객체에 함수 객체에 대한 참조를 직접 할당합니다.

네임 스페이스는 변수를 사용하여 전역 범위가 어수선하게 흩어지는 것을 방지하기 위해 만들어진 규칙입니다.

+0

안녕하십니까, @ GeoffreyHing! 도움을 주셔서 감사하지만 "폐쇄"단락이 지나치게 복잡하고 매우 혼란스러워 보입니다.하지만 네임 스페이스 설명은 명확하고 간결합니다. +1. – Ben

관련 문제