지금까지 몇 번 실행했습니다. 나는 그것을 증명할 수있는 가장 간단한 코드 조각을 만들려고 노력했다.jquery "this"는 "this"객체에 대한 액세스를 금지합니다.
문제는 내부 및 개체 메서드입니다. 익명 함수를 jQuery 메서드 (예 : "each")에 함수의 내부로 전달하면 함수의 내부에서 "this"에 대한 액세스 권한을 잃게됩니다. "this"는 이제 jQuery 객체와 관련이 있기 때문입니다.
(. 내가 객체 리터럴로 정의 된 개체를 기반으로 개체 인스턴스를 생성하는 크록 포드의 객체 기능을 사용하고 있습니다)
:문제의 핵심에 대한 logNameAndElementIds
방법의 중간에 주석을 참조하십시오
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
var objectLiteral = {
setName: function(name){
this.name = name;
},
logNameAndElementIds: function(){
// works fine, 'this' refers to object instance
console.log(this.name);
$('.foo').each(function(){
// we've lost "this" because it now refers to jQuery
console.log(this.name);
console.log($(this).attr('id'));
});
}
};
obj1 = Object.create(objectLiteral);
obj1.setName('Mike');
obj1.logNameAndElementIds();
이런 종류의 상황을 해결하거나 해결할 올바른 방법은 무엇입니까?
분명히 나의 예는 어리 석다. 그러나 그것은 단지 요점을 보여주기위한 것이다. 더 자주 jQuery와 일치하는 세트를 반복하고 각 항목에 포함 된 객체의 메소드를 호출하려고합니다. 하지만 jQuery의 "this"가 있기 때문에 객체의 메서드에 액세스 할 수 없습니다.
은 당신이 알고 있습니까 기존 [Object.create] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create)를 덮어 쓰시겠습니까? – some
자바 스크립트 IMHO의 함정 중 하나에 오신 것을 환영합니다. 밑줄이라는 외부 라이브러리를 사용하고 싶습니다. http://underscorejs.org/에서 확인하십시오. bind 함수는이 유형의 일에 특히 유용합니다. – Jlange