これが機能しない理由がわかりません。
var c=document.getElementById("myCanvas"),
ctx=c.getContext("2d");
ctx.moveTo(0,0);
ctx.lineTo.apply(this, [100, 100]);
ctx.stroke();
これが機能しない理由がわかりません。
var c=document.getElementById("myCanvas"),
ctx=c.getContext("2d");
ctx.moveTo(0,0);
ctx.lineTo.apply(this, [100, 100]);
ctx.stroke();
OK、あなたの答えの後にそれを機能させます、ありがとう。THIS は ctx 変数を指していると思いました。
var c=document.getElementById("myCanvas"),
ctx=c.getContext("2d");
ctx.moveTo(0,0);
ctx.lineTo.apply(ctx, [100, 100]);
ctx.stroke();
ありがとさよなら ;)
現時点でthisは、 ... をどうするかwindow本当にわからないか、このコードがラップされている関数を所有するオブジェクトが何であるかのいずれかです。 .lineTothis
このコードが関数でラップされていない場合 (またはラップされていても、その関数がオブジェクトのプロパティ以外の場合this=== window)。
例えば:
MyObj.myFunc = function () {
var c = document.getElementById("myCanvas"),
// ..........etc
ctx.lineTo.apply(this, [100,100]);
};
そのコードはas.lineToを使用して呼び出します。
その情報をどう処理すればよいかわからなかった場合、またはにアタッチする必要があるプロパティが見つからなかった場合、失敗します。MyObjthisMyObj.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
};
lineTothisコンテキストであるオブジェクトに依存
通常は として呼び出しctx.lineTo(...)、暗黙的に設定しますthis=ctx
ただし、を使用する.apply場合は、オーバーライドするオプションがありますthis
たまたまスコープ内にあるものに....lineTo.apply(this, ...)設定していると言う場合(通常はオブジェクト、またはドット表記を使用する場合は他の何か)。thiswindow
したがって、.....lineTo.apply(ctx, ...)