메소드 (예 : 객체에 할당 된 함수)를 실행할 때 내부에서 this
변수를 사용 하여이 객체를 참조 할 수 있습니다 .
var obj = {
someProperty: true,
someMethod: function() {
console.log(this.someProperty);
}
};
obj.someMethod(); // logs true
한 객체에서 다른 객체로 메소드를 할당하면 해당 this
변수는 새 객체를 참조합니다. 예를 들면 다음과 같습니다.
var obj = {
someProperty: true,
someMethod: function() {
console.log(this.someProperty);
}
};
var anotherObj = {
someProperty: false,
someMethod: obj.someMethod
};
anotherObj.someMethod(); // logs false
의 requestAnimationFrame
방법 window
을 다른 객체에 할당 할 때도 마찬가지 입니다. 이와 같은 기본 기능은 다른 컨텍스트에서 실행되지 않도록 기본 제공 보호 기능을 갖추고 있습니다.
이 Function.prototype.call()
다른 상황에서 함수를 호출 할 수 있도록 기능. 이 메소드의 첫 번째 매개 변수로 컨텍스트 (컨텍스트로 사용될 오브젝트)를 전달하면됩니다. 예를 들어 alert.call({})
제공합니다 TypeError: Illegal invocation
. 그러나 alert.call(window)
이제는 alert
원래 범위에서 실행 되기 때문에 제대로 작동합니다 .
.call()
당신이 그런 식으로 물건 을 사용한다면 :
support.animationFrame.call(window, function() {});
객체 대신 requestAnimationFrame
범위에서 실행 되기 때문에 제대로 작동 window
합니다.
그러나이 .call()
방법을 호출 할 때마다 사용 하는 것이 매우 우아한 해결책은 아닙니다. 대신을 사용할 수 있습니다 Function.prototype.bind()
. 와 비슷한 효과가 .call()
있지만 함수를 호출하는 대신 지정된 컨텍스트에서 항상 호출되는 새 함수를 만듭니다. 예를 들면 다음과 같습니다.
window.someProperty = true;
var obj = {
someProperty: false,
someMethod: function() {
console.log(this.someProperty);
}
};
var someMethodInWindowContext = obj.someMethod.bind(window);
someMethodInWindowContext(); // logs true
유일한 단점은 IE <= 8에서 지원되지 않는Function.prototype.bind()
ECMAScript 5의 일부라는 것 입니다. 입니다. 다행스럽게도 MDN에는 폴리 필이 있습니다 .
아마 이미 알았 듯이 .bind()
항상 requestAnimationFrame
컨텍스트에서 실행 하는 데 사용할 수 있습니다.window
. 코드는 다음과 같습니다.
var support = {
animationFrame: (window.requestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.msRequestAnimationFrame ||
window.oRequestAnimationFrame).bind(window)
};
그런 다음 간단히 사용할 수 있습니다 support.animationFrame(function() {});
.