*の概要this
JavaScriptで関数を実行する場合、デフォルトthisはwindowです。
function foo() {
console.log(this);
}
foo(); // => window
this値はさまざまな方法で変更できます。1つの方法は、オブジェクトのメソッドとして関数を呼び出すことです。
var x = {
foo: function() {
console.log(this);
}
};
x.foo(); // => This time it's the x object.
別の方法は、特定のオブジェクトのコンテキストで実行するように関数を使用callまたは指示することです。apply
function foo() {
console.log(this);
}
foo.call(x); // => x object again
foo.apply(x); // => x object as well
あなたcallまたはapplyonnullまたはundefinedの場合、デフォルトの動作が再び発生します:関数は次のコンテキストで実行されますwindow:
function foo() {
console.log(this);
}
foo.call(null); // => window
foo.apply(undefined); // => window
ただし、ECMAScript 5の厳密モードでthisは、デフォルトでウィンドウに設定されないことに注意してください。
(function() {
'use strict';
function foo() {
console.log(this);
}
foo(); // => undefined
foo.call(null); // => null
foo.apply(undefined); // => undefined
})();
thisを使用bindして、呼び出される前に関数をオブジェクトにバインドすることで設定することもできます。
function foo() {
console.log(this);
}
var bar = {
baz: 'some property'
};
var foobar = foo.bind(bar);
foobar(); // => calls foo with bar as this
結論
このコードを使用しています:
<a href="#" class="clickme" onclick="column_click()" title="my title">click me</a>
つまり、リンクをクリックすると、が実行されcolumn_click();ます。つまり、column_click関数はメソッドではなくプレーン関数として実行されます。これは、(1)オブジェクトのプロパティとして呼び出されない(someobject.column_click();)、(2)callまたはapplyで呼び出されない、(3)で呼び出されないためbindです。厳密モードでは実行されていないため、デフォルトthisはwindowです。
問題を解決する方法
したがって、問題を解決するには、call(またはapply)を使用して、要素のコンテキストで実行するように関数に指示するだけです。属性値内の小さなコード内でthis、要素を参照します。したがって、を使用できますcolumn_click.call(this)。とても簡単です!
<a href="#" class="clickme" onclick="column_click.call(this);" title="my title">click me</a>
ただし、要素を引数として渡すだけの方がおそらく理にかなっています。
<a href="#" class="clickme" onclick="column_click(this);" title="my title">click me</a>
引数を受け入れるように関数を変更します。
function column_click(el) {
// Use el instead of this...
}
* 技術を取得する
thisJavaScriptでは動的にスコープされます。この動作は、字句スコープが設定されている他のすべての変数とは異なります。他の変数には、関数の呼び出し方法に応じて異なるバインディングはありません。それらのスコープは、スクリプトに表示される場所から取得されます。ただし、動作は異なり、スクリプトのどこに表示されるかではなく、呼び出される方法thisに応じて、異なるバインディングを持つことができます。これは言語を学ぶ人々にとって混乱の原因となる可能性がありますが、熟練したJavaScript開発者になるためにはそれを習得する必要があります。