2011-09-06 4 views
3

변수 i를 카운터로하고 싶을 때마다 매번 100으로 초기화되고 있습니다.JavaScript로 마감

myFunction().f()으로 전화하는 방법은 무엇입니까?

function myFunction() { 
    var i=100; 
    function f() { 
     i=i+1; 
     return i; 
    } 
    return f(); // with parenthesis 
}; 
var X = myFunction(); 
console.log(X); 
X = myFunction(); 
console.log(X); 
+0

폐쇄의 목적이다 함수 내에서 변수 범위를 유지하지만 함수가 반환 된 후에도 변수는 상태를 유지합니다. 죄송합니다. 이것은 "폐쇄 목적은 무엇입니까?"에 대한 다른 사람의 의견에 대한 회신이었습니다. –

답변

9

f을 직접 호출 할 수 없습니다. 그것은 클로저에 싸여 있으며,이 지점은 모든 로컬 변수를 닫습니다. 너는 myFunction의 외부에 노출시켜야한다.

첫째 :

return f; //(); // withOUT parenthesis 
당신이 그것을에 기능을 할당 한 것으로

그럼 그냥, X를 호출합니다.

var X = myFunction(); 
X(); 
+0

감사합니다! console.log (X())를 두 번째로 실행하면 101을 반환합니다. –

+2

[시도 할 때] (http://jsfiddle.net/zhmng/) – Quentin

+0

OK, 알겠습니다! 감사! (나는 X = myFunction()을 두 번 할당했는데, 잘못되었다.) –

2

이 예는 101과 102을 반환 : Be sure to try it.

function myFunction() { 
    var i=100; 
    function f() { 
     i=i+1; 
     return i; 
    } 
    return f; // without any parenthesis 
}; 
var X = myFunction(); 
// X is a function here 
console.log(X()); 
// when you call it, variable i gets incremented 
console.log(X()); 
// now you can only access i by means of calling X() 
// variable i is protected by the closure 

당신이 폐쇄의 의미없는 친절 것이다 myFunction().f()를 호출해야하는 경우 :

function myFunction() { 
    var i=100; 
    function f() { 
     i=i+1; 
     return i; 
    } 
    return {x : f} 
}; 
var X = myFunction().x(); 
// X now contains 101 
var X = myFunction().x(); 
// X still contains 101 
// pointless, isn't it? 
+0

이것은 두 번 101을 반환합니다. 101, 102를 반환하고 싶습니다. –

+0

글쎄, 나는 클로저를 사용하는 올바른 방법을 이해하려고 노력하고 있습니다. 나는 무의미한 종류의 종결이 될 무언가를 배우고 싶지 않습니다. –

+0

오, 알겠습니다 ... 당신은 저에게 올바른 길과 잘못된 길을 보여주고있었습니다 ... –