범위

2012-09-07 3 views
3

이 HTML 고려 객체 :범위

<p>Click me</p> 

내가 각 p에 대한 클릭 핸들러 객체를 작성 좋아하지만, 문제로 실행하는 것을 나의 클릭 핸들러 함수가 수 찾을 수 없습니다.

이 코드는 않습니다 하지 일 :

(function(){ 
    var self = this; 

    $("p").each(function(){ 
     $(this).click(self.myFunction); 
    }); 

    self.myFunction = function(){ alert("myFunction"); } 
})();​ 

나는 함수에서 클릭 처리기 할당을 포장 때 는 않습니다 일 :

(function(){ 
    var self = this; 

    $("p").each(function(){ 
     $(this).click(function(){ self.myFunction(); }); 
    }); 

    self.myFunction = function(){ alert("myFunction"); } 
})(); 

질문 :하지 않는 이유 $(this).click(self.myFunction)가 작동하지만 $(this).click(function(){ self.myFunction(); })이 맞습니까?


편집 :

$("p").click(myFunction); 
function myFunction(){ alert("myFunction"); } 

이뿐만 아니라 실패 안 : 작업 않습니다 다음 코드?


P. 함수의 위치를 ​​이동하여 함수를 래핑 할 필요없이 내 개체가 작동하지 있어요.

(function(){ 
    var self = this; 

    self.myFunction = function(){ alert("myFunction"); } 

    $("p").each(function(){ 
     $(this).click(self.myFunction); 
    }); 
})(); 

문제는 파서와 관련이 있습니다.

+1

자바 스크립트 코드 구문 분석 및 평가 순서를 이해해야합니다. 다음을보십시오 : http://stackoverflow.com/questions/3887408/javascript-function-declaration-and-evaluation-order/3887590#3887590 – slebetman

+0

@slebetman +1 다른 질문에 답하십시오. 감사. –

답변

3

:

(function(){ 
    var self = this; 

    $("p").each(function(){ 
     $(this).click(self.myFunction); 
    }); 

    self.myFunction = function(){ alert("myFunction"); } 
})();? 

기준 즉시 평가하고, 아무것도 self 아직 배치되어 있지 않았기 때문에, 실패. 여기

:

(function(){ 
    var self = this; 

    $("p").each(function(){ 
     $(this).click(function(){ self.myFunction(); }); 
    }); 

    self.myFunction = function(){ alert("myFunction"); } 
})(); 

클릭이 실제로 일어날 때 기준이 self.myfunction이 할당 많이 후, 평가됩니다.

이것은 실제로 문제가 아니며 의도적 인 디자인 기능입니다. 이 예에서

:

$("p").click(myFunction); 
function myFunction(){ alert("myFunction"); } 

함수 이름이 범위의 상단에 게양되고있다. 이 함수 정의에는 동적 인 것이 없으므로 (동적으로 객체에 할당되지 않는다는 의미),이 범위 전체에서 위에서 아래로 사용할 수 있습니다.

함수는 JavaScript에서 많은 공백을 채 웁니다.

이들은 람다, 모듈, 메소드, 기능으로 작용하며, 지금 당장 생각할 수없는 기능입니다.

+1

좋은 설명은 내일 모든 투표를 다 사용 했으므로 내일 투표 할 것입니다.이 내용을 이해하는 데 도움이되는 추가 자료입니다 (John Resig 저). http://ejohn.org/apps/ learn – Asciiom

+0

설명해 주셔서 감사합니다. 객체를 설계 할 때이를 명심해야합니다. –

0

나는 이미 문제를 파악했다고 생각합니다. 핸들러를 부착하는 순간에는 self.myFunction이 정의되지 않으므로 핸들러도 첨부되지 않습니다. 당신이 function(){ self.myFunction(); }처럼 전화를 포장 할 때, 그때 self.myFunction 순간 핸들러에서 라고

는이 붙어하지 않을 때 호출됩니다. 이것으로