2010-12-06 4 views
6

"Javascript - The Good Parts"の実例です。JavaScriptの関数呼び出しパターンスコープのルール

function add(x, y){ return x + y}; 

var myObject = { 
    value: 0, 
    increment: function (inc) { 
     this.value += typeof inc === 'number' ? inc : 1; 
    } 
}; 

myObject.increment(2); 
document.writeln(myObject.value); 

myObject.double = function () { 
    var that = this; // Workaround. 

    var helper = function () { 
     that.value = add(that.value, that.value) 
    }; 

    helper(); // Invoke helper as a function. 
}; 

myObject.double(); 
document.writeln(myObject.value); // 4 

機能呼び出しパターンでは、 'this'オブジェクトはグローバル参照を持ちます。しかし、私は完全に理解することはできませんボンネット下に述べた回避策の: -

var that = this; // Workaround. 

我々はこれを行う場合は、私たちは「は」から「この」への参照をコピーしていませんか?すなわち 'それ'は 'this'と同じグローバルスコープに保持されますか?これは内部的にどのように機能しますか?

答えて

2

ここには2つの機能が含まれています.1つはmyObject.doubleで、もう1つはhelperです。 myObject.double()に電話するとmyObjectとなります。だからthat === myObject。後でその機能の中でhelper()とも呼ばれ、その範囲内にはthis === the global objectがあります。

10

それはここでは同じではないのですが、thismyObjectので、あなたはそれを持っている権利valueプロパティを取得していることをいい、thisは、あなたがそれをやっているように参照を保持したい理由です... windowを参照することになります。

You can test it out hereのうち、helper機能の中のいくつかのアラートは、何が起きているかを示しています。

myObject.double = function() { 
    var helper = function() { 
     this.value = add(this.value, this.value) 
    }; 
    helper.call(this); // Invoke helper as a function. 
}; 

You can test that version here

代替のでthisは次のように...あなたが欲しいmyObjectインスタンスを参照し続けて、右のコンテキストで.call()または.apply()関数になります。

+0

+1 – sojin

+1

また、前述の(Javascript The Good Parts)の前項では、The Method Invocation Patternについて詳しく説明しています。関数がオブジェクトのプロパティとして格納されているときは、それは方法です。 'myObject.double = function(){...};'はあなたのMethod Invocation Patternですので、その中に 'this'があると' myObject' –

+1

もう一つ注目すべきことは、提供された例は 'Function Invocation Pattern'に'内部関数 'を使用しています。ロジックを説明するためのより簡単な例を作成しました。http://jsbin.com/ciriwabeliwi/1/edit?js,consoleを参照してください。最後に、この本で提供される例は、http://jsbin.com/roheyekonabe/1/edit?js,consoleに相当します。 –

関連する問題