2014-07-20 2 views
0

애니메이션에 대한 선택 옵션을 만들고 싶습니다. 따라서 선택되는 유형에 상관없이 캔버스에 표시됩니다. 주요 JS에서 다음javascript scope in requestAnimationFrame

(function (exports) { 

    function animationA() {} 
    animationA.prototype.init = function(){} 
    animationA.prototype.draw = function(){} 

    exports.animationA = animationA; 
})(this); 

: 나는 오류 업데이트 (a.draw)에서 발생 발견

var a = new animationA(); 

    function setup() { 
    a.init(); 
    } 

    function update(callback) { 
    requestAnimationFrame(function() { 
     update(callback); 
    }); 
    console.log(this); 
    callback(); 
    } 

    setup(); 
    update(a.draw); 

그래서 나는 "클래스"각 애니메이션을합니다. 이 코드 줄에서는 a의 속성에 액세스 할 수 없습니다. 이것이 자바 스크립트 범위 문제인지 궁금합니다.

감사합니다.

+0

당신이 사용하는 'requestAnimationFrame' 기능에 관한 것이 아닙니다. 그것은 당신이'a.draw '를'update'에 넘기는 방법입니다. – Bergi

+0

['this' 키워드] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this)는 다음과 같습니다. 함수의 * scope *가 아니라 함수 호출의'context'입니다. – Bergi

답변

0

일반 이벤트 콜백과 마찬가지로 requestAnimationFrame을 호출하기 전에 콜백 내부에서 참조 할 컨텍스트에 대한 참조를 만들어야합니다.

Var that = this; 

requestAnimationFrame(function(){ 

that.doSimething(); 

}); 
+1

'RequestAnimationFrame'이란 무엇입니까? '이 '란 무엇입니까? – Bergi

+0

requestAnimationFrame은 브라우저가 그래픽 카드의 새로 고침 빈도에 따라 화면을 업데이트 할 때 실행되는 함수입니다. 대부분의 디스플레이가 60Hz에서 작동하기 때문에이 기능은 매 16.6666ms마다 작동합니다. 콜백 함수는 함수가 실행될 때 실행됩니다. 화면이 실제로 새로 고침 될 때마다 변형이 있으므로 항상 16.6666ms가 아니므로 requestAnimationFrame은 setInterval 또는 setTimeout 함수를 수행하는 것보다 훨씬 효율적입니다. –

+0

아, 그걸 'requestAnimationFrame'이라고합니다. 업데이트 주셔서 감사합니다! – Bergi