2012-10-31 8 views
1
function onMouseClickFunction() { 

    $mapCanvas.click(function (e) { 
     var x = cursor.getCursorPositionInCanvasX(e.pageX), 
      y = cursor.getCursorPositionInCanvasY(e.pageY); 

이 예제의 변수 범위는 onMouseclickFunction 함수 또는 jquery의 익명 함수입니다.javascript/jquery 함수 범위

자바 스크립트는 부모 함수의 상단에서 변수를 생성하는 것을 사용하기 때문에이 예제에서 어디에서 호이 스팅을 할 수 있습니까?

+0

감아 올리기가 마음에 드신다면 여기에서 내 대답을 확인하십시오. http://stackoverflow.com/questions/9085839/surprised-that-global-variable-has-undefined-value-in-javascript/9085872# 9085872 –

답변

4

변수가 xy 인 것으로 가정하면 click()으로 전달되는 익명의 함수입니다.

var 항상 범위의 현재 기능입니다.

자바 스크립트는 부모 함수의 상단에서 변수를 생성하는 것을 사용하고 있는데,이 예제에서 어디에서 호이 스팅을할까요?

호이 스팅은 var을 사용할 때 이전에 사용하려고 시도한 경우에도 해당 기능에 대해 범위가 지정됨을 의미합니다. 내부 함수가 호출 된 경우

function() { 
    var x = 1; 

    function() { 
     alert(x); 
     var x = 2; 
    } 
} 

즉, var x = 2가 내부 함수의 범위에 새로운 x을 (var가 게양되어있다) 생성하기 때문에 그것은 undefined 경고 것이나, 할당은 발생하지 않습니다 경보가 울릴 때까지 (과제물이 호송되지 않았기 때문에).

질문에있는 var 문은 모두 해당 기능의 맨 위에 나타나므로 호이 스팅은 아무런 차이가 없습니다.

5

올바르게 선언 된 모든 변수에는 항상 현재 함수에 대한 로컬 범위가 있습니다.

var 문을 올바르게 사용하고 있으므로 xy 변수는 익명의 기능에 국한됩니다.


당신이 당신의 onMouseClickFunction 함수에서 그 변수에 접근 할 수있게하려면, 당신은 당신의 click 이벤트 핸들러 외부를 선언해야합니다. 해당 기능 자체는 onMouseClickFunction 함수 내에서 선언되므로 클릭 핸들러 내에서 계속 액세스 할 수 있습니다.

이것은 자바 스크립트의 스코프 체인 조회로 알려져 있습니다. 사용중인 변수가 로컬 범위 내에서 선언되지 않은 경우 자바 스크립트는 현재 스코프 범위에서 선언하지 않습니다 (익명의 경우 함수는 바깥 쪽 onMouseClickFunction입니다. 거기에 선언되지 않았다면 스코프가 전역 범위에 도달 할 때까지 범위를 계속 살펴볼 것입니다.

범위 체인을 통해 변수를 찾을 수없는 경우 전역 범위에 새 변수 으로 선언됩니다. 그렇기 때문에 항상 변수를 var 문으로 선언해야합니다.

0

변수가 선언되는 함수이므로 후자 (익명 함수)가됩니다.

0

여기 작성한 내용은 closure입니다.

이와 같이 anonymous 함수는 onMouseClickFunction의 범위를 상속 받지만 x 및 y 변수는 익명 함수의 범위에만 있습니다.