绑定函数,这在打字稿中

时间:2015-12-28 19:34:46

标签: javascript typescript

我想实现一个简单的上下文绑定,但它在TypeScript中不起作用。 这是我的代码:

class Engine {
    // some code...

    spriteController(sprite: Sprite, callbackfn: (ctx: CanvasRenderingContext2D) => void) {
        callbackfn.bind(new SpriteController(sprite), [this._ctx]);
    }

    // code again ...
}

如果我想在另一个文件中使用spriteController方法:

engine.spriteController(sprite, function(ctx) {
    this.moveRight() // access to the spriteController class
})

我希望能够在回调中使用SpriteController类。
在JS中,第一个参数(在bind()调用中)绑定'这个'到给定的对象。但是在TypeScript中,从function.bind创建的函数总是保留这个'。
如何在TypeScript中实现这一点?

1 个答案:

答案 0 :(得分:1)

绑定时,它返回绑定函数,您必须更新变量宽度callbackfn = callbackfn.bind(...)

Documentation link

class Engine {
    spriteController(sprite: Sprite, callbackfn: (ctx: CanvasRenderingContext2D) => void) {
        let callbackfnBinded = callbackfn.bind(new SpriteController(sprite), [this._ctx])
        callbackfnBinded()
    }
}

这里的JavaScript:



var Sprite = (function () {
    function Sprite(name) {
        this.name = name;
    }
    return Sprite;
})();
var SpriteController = (function () {
    function SpriteController(sprite) {
        this.sprite = sprite;
    }
    return SpriteController;
})();
var Engine = (function () {
    function Engine() {
    }
    Engine.prototype.spriteController = function (sprite, callbackfn) {
        callbackfn = callbackfn.bind(new SpriteController(sprite), [this._ctx])
        callbackfn()
    };
    return Engine;
})();
var e = new Engine();
var s = new Sprite("test");
var cb = function (ctx) {
    alert(this.sprite.name);
};
e.spriteController(s, cb);