2011年5月24日火曜日

メソッドと関数の違いとthisは何を指しているか(JavaScriptの場合)

日頃、メソッドのことを関数と呼んでしまったり、関数をメソッドと呼んでしまったり混同していたりするわけですが、インスタンスの内部にあるのがメソッドです。

var objA = {};
objA.method = function(){
    console.log("method");
}
objA.method(); // これはメソッドの呼び出し

function func(){
    console.log("function");
}
func(); // これは関数の呼び出し

メソッドと関数の大きな違いの一つに「this」でインスタンスを参照できる点があります。メソッド内で「this」はインスタンスを指しています。では、関数内の「this」は何を指しているかというとグローバルオブジェクト(JavaScriptの場合)です。

ここまではよいのですが、メソッド内で関数が宣言されている場合にメソッド内で、その関数を呼び出した場合の関数内で「this」は何を指しているのでしょうか? 答えはグローバルオブジェクトです。

var hoge = "global";

var objB = {};
objB.hoge = "property";
objB.method = function(){
    var hoge = "local";
    function nestedFunction(){
        console.log("a:" + this.hoge); // グローバルのhogeを指している
    }
    console.log("b:" + hoge);  // この関数内のhogeを指している
    console.log("c:" + this.hoge); // インスタンス(つまりobjB)のhogeプロパティを指している
}

objC.method();
実行結果
a:global
b:local
c:property

0 件のコメント:

コメントを投稿