実現したいこと
オブジェクト内で、そのオブジェクト内のメソッドAを、メソッドBの中でsetTimeoutとともに使用したいのですが、その際の、thisについてよくわかりません。
前提
以下のようなコードで、オブジェクト内のメソッドで、同じオブジェクト内の別のメソッドを呼んでいます。
発生している問題・エラーメッセージ
この中で、fn3だけがエラーになります。
ncaught TypeError: this.fn1 is not a function
該当のソースコード
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <script> const person = { name: "Taro", fn1() { console.log("Hi" + " " + this.name) }, fn2() { setTimeout(()=> { this.fn1(); },1000) }, fn3() { setTimeout(function(){ this.fn1(); },1000) }, fn4() { const _this = this; setTimeout(function(){ _this.fn1(); },1000) } } person.fn1(); person.fn2(); person.fn3(); person.fn4(); </script> </body> </html>
試したこと
fn3を「this」でバインドしましたが、やはりエラーになります。
fn3() { setTimeout(function(){ this.fn1.bind(this)(); },1000) },
エラーメッセージ
Uncaught TypeError: Cannot read properties of undefined (reading 'bind')
疑問点は以下です。
① そもそもなぜアロー関数ではエラーが出ないのに、functionではエラーになるのでしょうか?
② 私の認識では、アロー関数とfunctionの違いは、「コールバック関数として渡す際、アロー関数はwindowオブジェクトとしてthisを見てしまうから注意」というものでしたが、それは今回の挙動の違いに関係しているのでしょうか?
③ fn4はネットで調べていて出てきた方法ですが、なぜエラーにならないのでしょうか?
頭が混乱しています。
どなたかよろしくお願いいたしますm(__)m
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。