回答編集履歴
1
文言
answer
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
ルールはわりとシンプルです。アロー関数のケースを除くと、
|
2
2
|
* `foo.bar()` と呼んだ場合、`bar()` 実行中は `foo` が `this` となる。
|
3
3
|
* `bar` が `bind(foo)` の結果なら、`bar()` と呼んだ場合は `foo` が `this` となる。
|
4
|
-
* `bar.call(foo)` と呼んだ場合、`bar()` 実行中は `foo` が `this` となる。
|
4
|
+
* `bar.call(foo)` や `bar.apply(foo, [])` と呼んだ場合、`bar()` 実行中は `foo` が `this` となる。
|
5
|
-
* そうではない場合、`bar()` と呼んだときは `window` などグローバルオブジェクトが`this` となる。
|
5
|
+
* そうではない場合、`bar()` と呼んだときは、非strictモードでは `window` などグローバルオブジェクトが`this` となる。strict モードでは `this` が `undefined` になる。
|
6
|
-
* `addEventLisetner()` など、コールバックするAPIの場合、コールバック内の`this`はAPIの仕様を参照する必要がある
|
6
|
+
* `addEventLisetner()` など、コールバックするAPIの場合、コールバック内の`this`はAPIの仕様を参照する必要がある
|
7
|
+
コールバックをどう呼ぶかはAPIを使う側からは見えないため。たいていは `bind()` した結果を渡すことで変更することができる)
|
7
8
|
|
8
9
|
|
9
|
-
「どう呼ばれるか」が重要です。
|
10
|
+
「どう呼ばれるか」が重要です。
|
11
|
+
|
12
|
+
> `accordion[i].addEventListener('click',this.openAccordion,false)`
|
13
|
+
|
14
|
+
このコードの場合、`this.openAccordion` は `openAccordion` 関数を実行していないので、`addEventListener()` の仕様に従いイベントターゲットの要素が `this` になります。`this` が `Accordion` クラスのインスタンスになって欲しい場合は、`this.openAccordion.bind(this)` を渡します。
|