62

私の質問は:

function Foo()
{
   this.foo = "bar"; // <- What is "this" here?
}

私が言えることから、それはどのようFooに使用されるか、つまりコンストラクターまたは関数として使用されるかによって異なります。thisさまざまな状況で何が起こる可能性がありますか?

4

6 に答える 6

72

thisキーワードは、関数が属するオブジェクト、または関数がオブジェクトwindowに属していない場合はオブジェクトを参照します。

これは、OOPコードで使用され、関数が属するクラス/オブジェクトを参照します。次に例を示します。

function foo() {
    this.value = 'Hello, world';

    this.bar = function() {
        alert(this.value);
    }
}

var inst = new foo();
inst.bar();

このアラート:Hello, world

または関数thisを使用して、どのオブジェクトが参照するかを操作できます。(時々非常に便利な機能)apply()call()

var bar1 = new function() {
    this.value = '#1';
}
var bar2 = new function() {
    this.value = '#2';
}

function foo() {
    alert(this.value);
}

foo.call(bar1); // Output: #1
foo.apply(bar2, []); // Output: #2
于 2009-12-26T13:22:56.573 に答える
28

ダグラス・クロックフォードがこの問題について何と言っているかを読んで、JavaScriptプログラミング言語の調査から彼を引用してください。

関数はオブジェクトです。他のオブジェクトと同じようにメンバーを含めることができます。これにより、関数に独自のデータテーブルを含めることができます。また、オブジェクトがコンストラクターと関連するメソッドのセットを含むクラスとして機能することもできます。

関数はオブジェクトのメンバーになることができます。関数がオブジェクトのメンバーである場合、それはメソッドと呼ばれます。オブジェクトのメソッドが呼び出されたときにオブジェクトに設定される、これと呼ばれる特別な変数があります。

たとえば、式foo.bar()では、this変数は関数バーの一種の追加引数としてオブジェクトfooに設定されます。次に、機能バーはこれを参照して、対象のオブジェクトにアクセスできます。

do.re.mi.fa()のようなより深い式では、この変数はオブジェクトdoではなくオブジェクトdo.re.miに設定されます。単純な関数呼び出しでは、これはグローバルオブジェクト(別名ウィンドウ)に設定されますが、これはあまり役に立ちません。正しい動作は、特に内部関数を呼び出すときに、これの現在の値を保持することでした。

また、「this」は、関数の呼び出し方法、 apply関数の読み取り、関数の呼び出しによって変わる可能性があります

ここからリンクされている彼の(無料の)プレゼンテーションで、JavaScriptの最大の頭脳の1つから学ぶことに時間を費やすことをお勧めします。

于 2009-12-26T13:31:00.900 に答える
10

JavaScriptでは、慣例(これは単なる慣例です)では、大文字で始まる関数はすべてコンストラクターとして使用されます。次に、

var foo = new Foo()thisによって参照されようとしている新しく作成されたオブジェクトを参照しますfoo

もちろん、Foo()自分で呼び出すことを妨げるものは何もありません。その場合this、関数が呼び出されたオブジェクトを参照します。混乱を避けるため、これはお勧めしません。

于 2009-12-26T13:36:39.950 に答える
1

JavaScriptでは、すべてがオブジェクトであり、関数です。this.foo次のコードで言うとき

function Foo()
{
   this.foo = "bar"; // <- What is "this" here?
}

fooFooオブジェクトのメンバー変数になります

于 2009-12-26T13:24:14.530 に答える