2012-04-09 6 views
0

node.js 비동기 코딩을 할 때 질문이 있습니다.node.js 함수에서 지역 변수를 유지하는 이유는 무엇입니까?

function foo(arg) { 
    var a = arg; 
    console.log(a + ' start'); 
    setTimeout(function() {console.log(a);}, 500); 
}; 
foo(1); 
foo(2); 

그것은 출력 :

1 start 
2 start 
1 
2 

I 혼란있어 다음은 예시적인 코드이다. 나는 로컬 변수가 foo에 의해 변경되기 때문에, 그것은 출력 ↓을해야한다고 생각 (2)

1 start 
2 start 
2 
2 

/방법 Node.js를 내부 콜백 함수 액세스를 위해 로컬 변수를 유지 왜 너희들이 말해 주 시겠어요? 감사합니다.

+0

찾고있는 개념은 [closure] (http://stackoverflow.com/questions/111102/how-do-javascript-closures-work)입니다. – geekosaur

답변

4

글로벌 변수가 아니기 때문에 로컬 변수입니다. 그것은 지역 변수의 핵심입니다.

var a은 함수 호출의 수명 동안 존재하는 변수를 만듭니다. 함수를 선언하면 그 함수를 덮기 위해 수명이 연장됩니다. 익명 함수가 호출 될 때 생성 된 범위에있는 a을 계속 사용합니다.

외부 함수를 두 번 호출하므로 두 개의 a이 있습니다. 각 통화마다 하나씩. 각 호출마다 하나씩 두 개의 익명 기능이 있습니다. 각 익명 함수는 a 중 하나와 동일한 범위에서 만들어졌습니다.

+1

"내부 함수를 선언하면 해당 함수를 덮기 위해 수명이 연장됩니다." 매우 명확하게 설명해 주셨습니다. 정말로 고마워요! – Rocky

1

JavaScript 변수는 블록이 아닌 함수 선언에 의해 범위가 지정됩니다. 따라서 두 개의 다른 변수를 사용하고 있습니다.

+0

답장을 보내 주셔서 감사합니다! 알았어, 내가 자바에 새로운 사람이야 :) – Rocky

1

정상적으로 작동합니다. 함수 내에서 변수 avar a;으로 선언했으며 로컬 변수를 선언했음을 선언했습니다. setTimeout의 콜백은 함수와 동일한 범위 안에 있습니다 (따라서 var a도 마찬가지입니다). 범위가 작동하는 방식을 이해하는 것은 단지 문제 일뿐입니다. 여기에 대한 오래된 좋은 소식입니다. http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/

또는 Google에서 'javascript scopes'를 검색하면 많은 참고 자료를 찾을 수 있습니다.

+0

대답 해줘서 고마워! 알았다 – Rocky

관련 문제