JavaScriptの関数内でグローバル変数と同じ名前のローカル変数を宣言した時、その変数名を呼ぶとローカル変数のほうが呼ばれることになります。なので、ローカル変数と同じ名前のグローバル変数を関数内から呼べなくなると思うかもしれませんが、そもそもグローバル変数はwindowオブジェクトのプロパティとなっているので、実はwindowオブジェクトからメンバー演算子を利用することにより、ローカル変数と同じ名前のグローバル変数にアクセスすることができます。
var hoge = "fuga"; //グローバル変数 function TestFunc(){ var hoge = "piyo"; //ローカル変数 console.log(hoge); console.log(window.hoge); console.log(this.hoge); } TestFunc(); // console.log(hoge); //=>"piyo" // console.log(window.hoge); //=>"fuga" // console.log(this.hoge); //=>"fuga"
最後のthis.hogeは、ここではwindow.hogeと同じになります。
ちなみに、『TestFunc()』ではなく、『new TestFunc()』とすると下記のようになります。
var hoge = "fuga"; //グローバル変数 function TestFunc(){ var hoge = "piyo"; //ローカル変数 console.log(hoge); console.log(window.hoge); console.log(this.hoge); } new TestFunc(); // console.log(hoge); //=>"piyo" // console.log(window.hoge); //=>"fuga" // console.log(this.hoge); //=>undefined
この場合のthisは『TestFunc』を継承して作られたオブジェクトになります。this.hogeとするとローカル変数のhogeを呼んでいるような気もしなくはないかもしれませんが、this.hogeとローカル変数のhogeは別物です。この場合、this.hogeは作成すらされていないので、『undefined』となります。たまに勘違いしちゃうので気をつけましょう(そんな勘違い、自分ぐらいかもしれませんが・・・)。
コメント