回答編集履歴

1

文言

2021/11/11 00:35

投稿

int32_t
int32_t

スコア20909

test CHANGED
@@ -4,14 +4,24 @@
4
4
 
5
5
  * `bar` が `bind(foo)` の結果なら、`bar()` と呼んだ場合は `foo` が `this` となる。
6
6
 
7
- * `bar.call(foo)` と呼んだ場合、`bar()` 実行中は `foo` が `this` となる。
7
+ * `bar.call(foo)` や `bar.apply(foo, [])` と呼んだ場合、`bar()` 実行中は `foo` が `this` となる。
8
8
 
9
- * そうではない場合、`bar()` と呼んだときは `window` などグローバルオブジェクトが`this` となる。
9
+ * そうではない場合、`bar()` と呼んだときは、非strictモードでは `window` などグローバルオブジェクトが`this` となる。strict モードでは `this` が `undefined` になる。
10
10
 
11
- * `addEventLisetner()` など、コールバックするAPIの場合、コールバック内の`this`はAPIの仕様を参照する必要がある (コールバックをどう呼ぶかはAPIを使う側からは見えないため)
11
+ * `addEventLisetner()` など、コールバックするAPIの場合、コールバック内の`this`はAPIの仕様を参照する必要がある
12
+
13
+ コールバックをどう呼ぶかはAPIを使う側からは見えないため。たいていは `bind()` した結果を渡すことで変更することができる)
12
14
 
13
15
 
14
16
 
15
17
 
16
18
 
17
19
  「どう呼ばれるか」が重要です。
20
+
21
+
22
+
23
+ > `accordion[i].addEventListener('click',this.openAccordion,false)`
24
+
25
+
26
+
27
+ このコードの場合、`this.openAccordion` は `openAccordion` 関数を実行していないので、`addEventListener()` の仕様に従いイベントターゲットの要素が `this` になります。`this` が `Accordion` クラスのインスタンスになって欲しい場合は、`this.openAccordion.bind(this)` を渡します。