2

JavaScript でスコープを管理する方法がまだわかりません。この特定の例では、特定のプロパティを含む描画関数と、配列に基づいて線を描画する必要がある関数があります。

function Draw (canvas)
{
    this.ctx = canvas.getContext('2d');
    this.street_size = 20;
}

Draw.prototype.street = function (MAP)
{

    MAP.forEach(function (name)
    {
        this.ctx.moveTo(name.start.x,name.start.y);
        this.ctx.lineTo(name.end.x,name.end.y)
        this.ctx.stroke();
    });
}

もちろん、forEach 関数内の「this.ctx」は「undefined」を返します。Draw() の変数が forEach 関数に確実に渡されるようにするにはどうすればよいですか (ctx = this.ctx のようなことはしません)。

4

3 に答える 3

7

.bind [MDN]を使用できます:

MAP.forEach(function (name) {
    this.ctx.moveTo(name.start.x,name.start.y);
    this.ctx.lineTo(name.end.x,name.end.y)
    this.ctx.stroke();
}.bind(this));

の詳細をご覧くださいthis

于 2013-02-11T01:32:21.783 に答える
4

オブジェクト インスタンス変数をメソッド スコープ内の新しい変数として宣言するのが一般的です。

var self = this;
MAP.forEach(function (name) {
    self.ctx.moveTo(...

thisこれにより、通常どおり使用し続けることができるという利点があります。

于 2013-02-11T01:34:08.017 に答える
3

thisの 2 番目の引数として渡しますforEach()

MAP.forEach(function (name)
{
    this.ctx.moveTo(name.start.x,name.start.y);
    this.ctx.lineTo(name.end.x,name.end.y)
    this.ctx.stroke();
}, this);

2 番目の引数はthis、コールバックの値を設定します。


MDNforEach()ドキュメント-array.forEach(callback[, thisArg])

于 2013-02-11T01:32:55.997 に答える