1

これが機能しない理由がわかりません。

var c=document.getElementById("myCanvas"),
ctx=c.getContext("2d");
ctx.moveTo(0,0);
ctx.lineTo.apply(this, [100, 100]);
ctx.stroke();
4

3 に答える 3

3

OK、あなたの答えの後にそれを機能させます、ありがとう。THIS は ctx 変数を指していると思いました。

var c=document.getElementById("myCanvas"),
ctx=c.getContext("2d");
ctx.moveTo(0,0);
ctx.lineTo.apply(ctx, [100, 100]);
ctx.stroke();

ありがとさよなら ;)

于 2012-08-06T10:57:02.780 に答える
2

現時点でthisは、 ... をどうするかwindow本当にわからないか、このコードがラップされている関数を所有するオブジェクトが何であるかのいずれかです。 .lineTothis

このコードが関数でラップされていない場合 (またはラップされていても、その関数がオブジェクトのプロパティ以外の場合this=== window)。

例えば:

MyObj.myFunc = function () {
    var c = document.getElementById("myCanvas"),
    //  ..........etc
    ctx.lineTo.apply(this, [100,100]);
};

そのコードはas.lineToを使用して呼び出します。 その情報をどう処理すればよいかわからなかった場合、またはにアタッチする必要があるプロパティが見つからなかった場合、失敗します。MyObjthis
MyObj.lineToMyObj

thisへの書き込みではなく、からの読み取りの他のほとんどすべてのケースでは、thisを参照しwindowます。

もう 1 つのよくある落とし穴: 関数内の関数。

MyObj = {
    name : "Bob",
    sayName : function () {
        console.log(this.name); // works -- "this"===MyObj
        var say_it_again = function () {
            console.log(this.name + ", for the second time");
        };
        say_it_again();
        // second function doesn't work -- "this"===window
};

この場合に適切にスコープthisするには、最初の関数で変数として保存し、2 番目の関数で参照します。

MyObj = {
    name : "Bob",
    sayName : function () {
        var person = this; // now the reference to "this" is kept in "person"
        console.log(this.name); // works -- "this"===MyObj
        var say_it_again = function () {
            console.log(person.name + ", for the second time");
        };
        say_it_again();
        // works -- "person" refers to the saved variable in the first function
        // that variable happens to hold a reference to "this" from the first function
        // which happens to be MyObj
};
于 2012-08-05T13:32:47.553 に答える
0

lineTothisコンテキストであるオブジェクトに依存

通常は として呼び出しctx.lineTo(...)、暗黙的に設定しますthis=ctx

ただし、を使用する.apply場合は、オーバーライドするオプションがありますthis

たまたまスコープ内にあるものに....lineTo.apply(this, ...)設定していると言う場合(通常はオブジェクト、またはドット表記を使用する場合は他の何か)。thiswindow

したがって、.....lineTo.apply(ctx, ...)

于 2013-11-07T14:01:19.737 に答える