JavaScriptのthisで勘違いしていたパターン
ネストした関数の内部でthis
が使えないなど、JavaScriptのthis
は使い方が難しいです。
this
が使えないと思ったら実は正しく動いた、ということがあったので、そのコードを備忘録として残しておきます。
サンプルコード
勘違いしていたのは次のようなパターンです。
(function() { "use strict" var obj = function() { return { foo: function() { this.bar(); }, bar: function() { console.log("barが呼び出された!"); } }; }(); obj.foo(); }());
オブジェクトを生成して返却する関数を定義します。
返却するオブジェクトは、オブジェクトリテラルで定義します。
そのオブジェクトリテラルにおいてfoo
メソッドとbar
メソッドをメンバーとして定義します。
foo
メソッドはbar
メソッドを呼び出します。
これを実行すると
barが呼び出された!
となります。
foo
メソッドからbar
メソッドを呼び出すときのthis
が、そのオブジェクト自身を指さないのではないか、と勘違いしていたのですが、実は正しく動作しました。
となると、次のようなパターンではどうでしょうか?
(function() { "use strict" var obj = function() { return { foo: function() { (function() { this.bar(); }()); }, bar: function() { console.log("これはムリっぽい"); } }; }(); obj.foo(); }());
無理やり関数をネストさせてみました。 これをChromeで実行すると
Uncaught TypeError: Cannot call method 'bar' of undefined
予想どおりやっぱりthis
は使えませんでした。
結論
JavaScriptのthis
は難しいです。いろいろ試行錯誤して覚えるしかないですね。