2

编码

var x = {};

x.request = window.requestAnimationFrame;

function step(timestamp) {

    console.log('sth');
}

x.request(step);

它返回:

NS_ERROR_XPC_BAD_OP_ON_WN_PROTO:对 WrappedNative 原型对象的非法操作

它应该使 x.request 与 window.requestAnimationFrame 一样工作。我需要它,因为我想做类似的东西:

x.request = window.requestAnimationFrame
                ||
            window.webkitRequestAnimationFrame
                ||
            window.mozRequestAnimationFrame;
4

2 回答 2

6

尝试

x.request.call(window, step);

这将确保它thiswindow.

于 2013-11-07T18:16:09.500 回答
1

这是一个上下文问题。上下文是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,因为这就是函数的调用方式。您正在为函数调用提供上下文,该上下文就是 object 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,因此您需要为不支持的浏览器提供 shim。)

于 2013-11-07T18:21:50.490 回答