2011-03-08 4 views
0

현재 해결 방법이 더 간단한 해결책이 있는지 궁금합니다.상위 함수에서 재정의 된 변수에 액세스하십시오.

자바 스크립트 예 :

var data= { 
    'key1':'value1' 
}; 

$.each(data,function foo() { 
    alert(this); //alerts 'value1' 
    $('#element').click(function()) { 
    alert(this); //alerts something else 
    } 
}); 

해결하는 방법이 될 것이다 :

var data= { 
    'key1':'value1' 
}; 


$.each(data,function foo() { 
    alert(this); //alerts 'value1' 

    var this_original=this; 

    $('#element').click(function()) { 
    alert(this_original); //alerts 'value1' 
    } 
}); 

이 문제를 해결하지만, 매우 깨끗하지 않습니다. 자식 함수의 원래 내부 값을 얻기위한 멋진 Javascript/jQuery 메서드가 있는지 궁금합니다. 같은 뭔가 : parentFunction.this

+1

코드에서 'var that = this;'에 익숙해 져야 할 것입니다. 더 자세한 설명은 뒤따라야 할 것이지만 "this"는 코드가 현재 실행되고있는 객체에 대한 참조입니다. 일단 당신이 클릭 기능에 들어가면, 당신은 다른 맥락으로 이동했고, "이것"은 함께 간다. – lsuarez

+0

jQuery "proxy"함수가 어떤 식 으로든 도움이 될까요? – Kranu

+0

예. 실제로 복잡성 계층이 필요하지 않으면 권장하지 않습니다. 의미는 검색 할 컨텍스트가있는 객체의 멤버, 즉'data'에서'onClick() '이라는 멤버 함수를 선언하는 것과 같이 이벤트 핸들러를 연결해야한다는 것입니다. – lsuarez

답변

2

, this를 사용하는 대신 인수를 사용하지 마십시오

var data= { 
    'key1':'value1' 
}; 

$.each(data,function foo(idx,val) { 
    alert(val); //alerts 'value1' 
    $('#element').click(function() { 
    alert(val); //alerts 'value1' 
    }); 
}); 
+0

그게 작동합니다 q = 고마워요! – Kranu

-1

사용 jQuery.proxy을. 다음 코드를 사용할 수 있습니다.

var data= { 
    'key1':'value1' 
}; 

$.each(data,function foo() { 
    alert(this); //alerts 'value1' 
    $('#element').click($.proxy(function() { 
    alert(this); }, this); 
}); 
+0

해당 코드는 의도 한대로 작동하지 않습니다. HTMLElement에 경고합니다. – lsuarez

1

Martin Jespersen의 답변을 사용하십시오. 그러나 ...

요청으로 jQuery의 .proxy() 기능을 사용하여 : 여기

var data = { 
    "key1": "value1" 
}; 

$.each(data, function(i, obj) { 
    alert(this); //alerts 'value1' 
    this.onClick = function() { 
     alert(this); 
    } 

    $('#element').click($.proxy(this, "onClick")); 
}); 

a fiddle example입니다.

클릭 이벤트를 바인딩하는 위치의 선택기를 변경하는 방법을 사용하고 싶을 것입니다.

+0

고마워요! 나는 당신에게 "보조 솔루션"포인트를 줄 수 있었으면 좋겠지 만, 내가 할 수있는 것은 +1 – Kranu

+0

@ 크라누 글쎄, 누가 알 겠어? 나중에 예상치 못한 일이 생길 때 필요할 수 있습니다. 지식을 공유하고 녹색 체크 표시를 계산하지 않았습니다. :] – lsuarez

관련 문제