2010-01-30 5 views
0

나는 Prototype을 사용하여 클래스 세트로 리팩토링 할 때 사용하는 다소 큰 자바 스크립트 함수를 가지고 있습니다.클래스에 대한 익명의 javascript 함수 바인딩을 단순화

클래스에 익명 함수를 바인딩 할 수있는 방법이 있는지 궁금합니다. 마지막에 바인드를 추가하는 것을 잊어 버립니다. 아니면 항상 이렇게하는 것입니까?

var arr = this.getSomeArray(); 
arr.each(function(t) { 
    t.update(val); 
    this.updateJSValue(t); 
}.bind(this)); 

답변

1

옵션은 this보다는 지역 변수를 몇 가지 기능 (bind, addMethods 또는 당신이 쓰는 다른 함수)를 호출하거나 사용 기본적으로 다음과 같습니다

var self=this; 
arr.each(function(t) { 
    t.update(val); 
    self.updateJSValue(t); 
}); 

당신은 많은 기능을 한 경우 , 로컬 변수는 최소한의 타이핑을 요구한다. 단지 몇개의 함수만으로는 너무 큰 차이가 없다.

function ThingMixin(self) { 
    self.foo = function(arr) { 
     arr.each(function(t) { 
      t.update(val); 
      self.updateJSValue(t); 
     }); 
    }; 
    ... 
}; 
... 
ThingMixin(Ralph.prototype); 

// or an anonymous function: 
(function (self){ 
    self.foo = function(arr) { 
     arr.each(function(t) { 
      t.update(val); 
      self.updateJSValue(t); 
     }); 
    }; 
    ... 
})(Ralph.prototype); 
+0

로컬 변수를 사용하면 어떤 종류의 성능 향상/감소가 있습니까? 이런 일이 일어나고있는 대부분의 장소는 이중 루프에 있습니다. – Casey

+0

변수가 클로저로 인해 더 오래 지속되기 때문에 메모리 사용량이 약간 증가 할 것으로 예상되지만 성능에 미치는 영향은 무시할 수 있어야합니다. 'bind'는 로컬 변수를 사용할 가능성이 높습니다. – outis

+0

이 코멘트는 성능보다는 정확성과 더 관련이 있습니다.하지만 반복 할 때마다 동일한 객체에 바인딩하려는 경우 루프 외부에서 'self'를 설정하면 성능에 미치는 영향을 눈치 채지 못할 것입니다. 다른 객체에 바인드하려면 루프 블록 안에'self'를 선언하십시오. – outis

관련 문제