2013-11-26 2 views
4

.bind() 메서드 및 "self = this"변수 사용시 "this"를 사용하는 데 어려움을 겪고 있습니다. 이들과 함께 두 가지 다른 결과를 얻으 려하므로 하나의 개념이 빠져 있습니다. 이 사건은 다음과 같다 :변수 자체 비교 차이점

// Defining a callback class to use after retrieving data 
var Callback = (function(){ 
    // UPDATED!! Local vbles 
    var template_to_use, html_element, self; 

    function Callback(){ 
     self = this, 
     template_to_use = null, 
     html_element = null; 
    } 

    var p = Callback.prototype; 
    p.set_template = function(template_funct){ 
     self.template_to_use = template_funct; 
    }; 

    p.set_html_element = function(html_element){ 
     self.html_element = html_element; 
    }; 

    p.use_callback  = function(data){                
     $(self.html_element).append(self.template_to_use(data)); 
    }; 

    return Callback; 
})(); 

이 기능의 사용은 다음과 같다 :

// Setup callback 1 to call after getting the data 
var callback_1 = new Callback(); 
callback_1.set_template(use_templ_1); 
callback_1.set_html_element("#list"); 

// Get list data 
api_list.get_data(callback_1.use_callback); 


// Setup callback 2 to call after getting more data 
var callback_2 = new Callback(); 
callback_2.set_template(use_templ_2); 
callback_2.set_html_element("#object"); 

// Get object data 
api_object.get_data(callback_2.use_callback); 

두 아약스 호출이 실행되고 get_data() 함수가 수행되면, 그들은 콜백 함수를 호출합니다 나는 그들에게 넘어 갔다. 내가 겪고있는 문제는 해당 함수를 실행 한 후 콜백은 항상 해당 템플릿 "use_templ_2"로 html_element = "#object"를 언급한다는 것입니다.

"this"와 "self"vble 대신 .bind 함수를 사용하면 결과가 예상됩니다.

// Get object data 
api_object.get_data(callback_2.use_callback.bind(callback_2)); 

무엇이 누락 되었습니까? 내가 js에 익숙하지 않더라도, 나는 언어 자체를 완전히 이해하고 있기 때문에 오류 개념 일 수 있습니다.

+2

'self' 변수를 지역 변수로 정의하지 않으므로 두 함수 모두 * 동일한 * 전역 변수를 사용합니다. – JJJ

+0

우선 jQuery의 아주 오래된 버전을 사용하지 않으면 .bind()를 사용하지 마십시오. on()이 현재 선호되는 메소드입니다. – trysis

+0

@Juhana :'var'가 누락 된 것처럼 보입니다. 마지막 항목을 제외한 모든 항목에 쉼표가 있습니다. –

답변

2

self는 항상 마지막 통해 인스턴스 객체를 참조,주의 너의 경우에는 쓸모 없어.

+0

나는 당신이 나에게 전달한 링크를 읽고 있었고, 내가 vbles가 공유 될 모듈 패턴을 구현한다면 그것은 의미가있을 것이다. 나는 어떤 개념을 놓치고 있지만 어떤 생각인지 모른다. 두 개의 선언이있는 경우, 두 개의 객체를 생성하는 이유는 무엇입니까? 실제로 "template_to_use"및 "html_element"속성은 자체 값을 유지하지만 "self"속성은 유지하지 않습니다. – kitimenpolku

+1

자체 변수를 래핑하는 선언은 하나 뿐이며 모든 객체는 실제로 공통 범위 인'(function() {...})()'을 공유합니다. – leaf

+0

이것은 설명하기가 꽤 어렵습니다. 사람들이 더 나은 링크를 공유 할 수 있기를 바랍니다. – leaf

4

selfthis의 차이점에 대해 묻는다면 self은 원래 this의 참조로 사용됩니다. 즉, this의 내용이 변경되는 경우에도 self에 이전 내용이 계속 포함됩니다.

충분히 명확하지 않은지 모르겠다. 그렇지 않다면 What underlies this JavaScript idiom: var self = this? 또는 Difference between self and this in javascript and when to use either of them을보십시오.

또한 브라우저에서 현재 뭔가 사용하고 있기 때문에 self을 전역 변수로 사용하지 마십시오. 미안해. 나는 누군가를 위해이 정보를 편집 할 수 있다면 그것을 기억할 수 없다. this가 완전히 교체,

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures

c1.set_html_element(html_element); 
는 말했다 :

var c1 = new Callback(); 
var c2 = new Callback(); // overrides previous self 

그런 다음 행이 실제로 c2.html_element 설정 :

+2

'window.self' (현재 창)를 사용하여'window.top'와 비교할 수 있습니다.더 높은 우선 순위를 가지기 때문에 'self'라는 로컬 변수를 사용하는 것과 충돌하지 않습니다. –

+0

+1 해명 해 주셔서 감사합니다. – Dropout