回答編集履歴

1

指定されないときのthisが間違っていた…

2017/03/10 19:35

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -70,11 +70,11 @@
70
70
 
71
71
 
72
72
 
73
- JavaScriptでは`a.f()`という形で関数が実行された場合、`a.f`が指す関数(`a`の`f`というプロパティに該当する関数)を**`this`が`a`であるコンテキストで**呼び出します。いわゆるメソッド呼び出しという物です。では、一旦`a.f`を変数`g`に入れて`g()`とした場合、どうなるでしょうか?この場合は`.`がないため、そのような特殊な呼び出しはせず、**`this`が呼び出すところの`this`であるコンテキストで**呼び出します。上の場合はグローバルでの`this`はグローバルオブジェクトであり、グローバルオブジェクトには`x`というプロパティがないのでundefinedになるというわけです。
73
+ JavaScriptでは`a.f()`という形で関数が実行された場合、`a.f`が指す関数(`a`の`f`というプロパティに該当する関数)を**`this`が`a`であるコンテキストで**呼び出します。いわゆるメソッド呼び出しという物です。では、一旦`a.f`を変数`g`に入れて`g()`とした場合、どうなるでしょうか?この場合は`.`でレシーバがないため、そのような特殊な呼び出しはせず、**`this`がグローバルオブジェクト(strictモードはundefined)であるコンテキストで**呼び出します。つまり、`this`はグローバルオブジェクトであり、グローバルオブジェクトには`x`というプロパティがないのでundefinedになるというわけです。
74
74
 
75
75
 
76
76
 
77
- これと同じ事です。`addEventListher()`で登録したとき、登録されるのは関数そのものです。そこには`this`が何であるかという情報はありません。実際イベントが発生し、呼び出されるときは、そのイベントを処理している所から呼び出されるので、そこでの`this`(この場合はイベントが発生するターゲットになります)が`this`として関数が実行されます。つまり、登録されている`dropped`関数の処理をするとき、その中での`this`は`addEventListher()`で登録したときの`this`とは**異なる**ということです。この`this`には`func`など無いのでエラーになると言うことです。
77
+ これと似たような事です。`addEventListher()`で登録したとき、登録されるのは関数そのものです。そこには`this`が何であるかという情報はありません。実際イベントが発生し、呼び出されるときは、そのイベントを処理している所から別途`this`を指定して(`call()`や`apply()`を内部で使用)、または、指定せずに呼び出されるので、全く異なるオブジェクト(この場合はイベントが発生するターゲットになります)が`this`として関数が実行されます。つまり、登録されている`dropped`関数の処理をするとき、その中での`this`は`addEventListher()`で登録したときの`this`とは**異なる**ということです。この`this`には`func`など無いのでエラーになると言うことです。
78
78
 
79
79
 
80
80