이것은 문제입니다 문맥. 컨텍스트는의 가치입니다 this
함수 내부.
예를 들어:
var a = {
name: 'object a',
fn: function() {
return name;
}
},
b = {
name: 'object b'
};
b.fn = a.fn;
console.log(b.fn());
어떤 결과를 얻을 수 있습니까? 당신은 당신이 얻을 것이라고 생각할 수도 있습니다 'object a'
, 그것이 함수가 정의 된 방식이기 때문입니다. 사실 당신은 얻을 것입니다 object b
, 그것이 함수가 호출되는 방식이기 때문입니다. 당신은 a 문맥 함수 호출의 경우 해당 컨텍스트는 객체입니다. b
.
코드와의 명확한 평행을 볼 수 있습니다!
x.request = window.requestAnimationFrame;
x.request(step);
이제 전화의 맥락은입니다 x
. 분명히 requestAnimationFrame
맥락에 관심이 있고 잘못된 것과 함께 작동하지 않습니다.
따라서 올바른 것을 제공해야합니다. 이 작업을 수행하는 두 가지 방법이 있습니다. 사용을 사용하여 함수를 호출 할 때 컨텍스트를 설정할 수 있습니다. Function#call
, 또는 이전에 컨텍스트를 설정할 수 있습니다 Function#bind
:
// with call
x.request.call(window, step); // provide the window object as the context
// with bind
x.request = window.requestAnimationFrame.bind(window);
(그러나 모든 브라우저가 지원하는 것은 아닙니다. bind
, 당신은 필요합니다 그렇지 않은 사람들에게 심을 제공하십시오.)