2013-11-14 2 views
-1

다음 예제에서 y 값은 1입니까? 나는 자바 함수 및 클로저 이해

(function() { 
    function foo(x) { 
     var callNum = 0; 
     var baz = 3; 
     return function (y) { 
      callNum++; 
      console.log("callNum: " + callNum); 
      console.log("y: " + y); 
      console.log("baz: " + baz); 
      console.log("x: " + x); 
      console.log(x + y + (++baz)); 
     } 
    } 
var moo = foo(2); // moo is now a closure. 
moo(1); 
moo(1); 
})(); 

여기 바이올린 출력 로그의 ... 값을보고 일부 로깅을 추가와 y가 할당된다 방법/이해가 안 :

callNum: 1 
    y: 1 
    baz: 3 
    x: 2 
    7 
    callNum: 2 
    y: 1 
    baz: 4 
    x: 2 
    8 
+3

질문은 다음과 같아야합니다. "내부적으로 '음매'는 무엇입니까?". 일단 당신이 그것을 얻으면, 그것은'y'가 할당 된 곳에서 꽤 명확합니다;) –

+2

'y'가 1이 아닐 것이라고 왜 기대할 수 있습니까? – tymeJV

+1

'y'는'assigned '가 아니고'foo'가 반환 한 함수'moo'에 전달됩니다. 두 번 모두 '1'을 전달하므로 1이됩니다. –

답변

2

foo() 함수를 반환합니다. 이 반환 된 함수는 당신이 염려하는 y이라는 단일 인수를받습니다.

그래서 당신은이 작업을 수행 할 때

// returns a function that accepts `y` with `x` shared via closure 
var moo = foo(2); 

// execute the inner function, passing in a value for `y`. 
moo(1); 

foo(2) 함수를 반환합니다. x이 이제 2입니다. moo은 이제 y의 값을 받아들이고 1을 전달하는 함수입니다. 따라서 y1입니다.

foo(x)(y); 

또는 값으로 사용하고 있습니까 :


가 그것을 다른 방법을 생각하려면 수행하여 내부 함수를 호출 할 수 있습니다

foo(2)(1); 

그래서 대답에 귀하의 질문, y은 으로 설정됩니다.

moo(1); 
코드에서 5,
0

:

(function() { 
    function foo(x) { 
     var callNum = 0; 
     var baz = 3; 

이는 (X, callNum바즈)을 중요한 매개 변수입니다.

 return function (y) { 

이 함수 (foo를 포함하는) 외부 로컬 변수들 각각에 대한 고정을 가진다 : 그들은 다음과 같은 기능을 포함하는 마개를 형성한다.

  callNum++; 
      console.log("callNum: " + callNum); 
      console.log("y: " + y); 
      console.log("baz: " + baz); 
      console.log("x: " + x); 
      console.log(x + y + (++baz)); 
     } 
    } 

그러나 그것은 결과에 관계가 있으므로 사용하지 않는 것, 또한 moo 모두 위의 기능을 포함하는 폐쇄가 있습니다.

var moo = foo(2); // moo is now a closure. 

나머지는 Alex가 대답합니다.