2013-08-07 1 views
1

의 간단한 싱글 톤 구현을 생각해 보자 :Javascript - 클로저에 대한 인수 사용, 불량 또는 양호?

var singleton = function (Constructor) { 
    var singleton; 
    return function() { 
     if (!singleton) { 
      singleton = new Constructor(); 
     } 
     return singleton; 
    }; 
}; 

우리는 인수에 싱글 변수의 선언을 움직일 수 : 부작용에 대한

var singleton = function (Constructor, singleton) { 
    return function() { 
     if (!singleton) { 
      singleton = new Constructor(); 
     } 
     return singleton; 
    }; 
}; 

는 그래서 단순히 호기심.

하나 더 예 :

var counter = (function (i) { 
    return function() { 
     i = (i || 0) + 1; 
     return i; 
    }; 
}()); 
+0

을 사용하십시오. 'counter'예제는 불필요하게 복잡해 보이며, 모든 호출에서'(i || 0) '을 사용하면 복잡해 보입니다. 바깥 함수에서'var i = 0; '을 사용하는 것이 더 효율적이며, 내부 함수는 한 줄짜리 일 수 있습니다 :'return ++ i;'. – nnnnnn

답변

4

우리는,

첫 번째 인수에 단일 변수의 선언을 이동 사용하여 노트에 outselves을 묶는없이의이 이야기하는 것을 가능하게 할 수있다 2 개의 에 대해 동일한 기호 (singleton)가 완전히 동일한 코드 행 내에서 가지가 다를 수 있습니다.

은 여기 seecond 예 이름 : 당신이 한 경우

var singleton = function (Constructor, instance) { 
    return function() { 
     if (!instance) { 
      instance = new Constructor(); 
     } 
     return instance; 
    }; 
}; 

다음에 Constructor을 전달하고, instance를 지정합니다 두 개의 인수로 singleton 함수를 호출, 그 무의미   Constructor 다시 singleton (호출되지 않을 것이다 — , 당신이 두 개의 args를 통과한다면 (그리고 두 번째 arg는 진실이다.)). 그래서 그렇게하는 것이 약간 이상 할 것입니다.

하지만 부작용에 대해 물었습니다. 함수 내에서 형식 인수에 지정하면 외부 효과가 없습니다. 그것은 예를 들어, 어떤 효과 외부 이없는 기능 : 오히려, 비 엄격 모드에서, 작은 비용이 않는 로컬 변수에보다 인수에 할당 그러나

function foo(arg) { 
    arg = 67; 
} 
var a = 42; 
foo(a); 
console.log(a); // Still 42 

, 때문에 거기에 오버 헤드가 관련되어 있습니다 : 이것은 마법 arguments 의사 배열과 관련이 있습니다. 비 엄격 모드에서는 함수의 형식 인수와 arguments 의사 배열 사이의 링크가있다 :

function foo(a, b) { 
    console.log(a); 
    console.log(b); 
    b = 42; 
    console.log(arguments[1]); 
} 

우리는이 같은 것을 호출하는 경우 :

foo(1, 2); 

우리가 볼

1 
2 
42

마법에 유의하십시오. 공식 인수 b에 할당하면 의사 배열 arguments이 업데이트되었습니다. (다른 방식으로도 작동합니다.)이 링크의 작지만 실제 런타임 비용이 있습니다.

은 (엄격한 모드에서는이 매우 이유로 어떠한 링크도 없다.)

+0

추가하기를 원한다. 복잡하고 생성자를 무시하고 전체 싱글 톤을 깨뜨릴 수있다. –

1

은 훨씬 closure 간다 두 구현들에서 아무런 차이가 없다. 그러나 첫 번째 예에서 싱글 톤은 호출자가 설정할 수 없습니다.

이 예제 함수 밖에서 싱글 톤을 만들 수 있었는지 여부에 따라 두 구현 중에서 선택합니다. 가능하다면 model 2을 사용하십시오. 그렇지 않으면 model 1