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