teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

文言

2021/11/11 00:35

投稿

int32_t
int32_t

スコア21933

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の仕様を参照する必要がある (コールバックをどう呼ぶかは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)` を渡します。