私の質問は:
function Foo()
{
this.foo = "bar"; // <- What is "this" here?
}
私が知ることができることから、Foo
がどのように使用されているか、つまり、コンストラクターまたは関数として使用されるかどうかに依存します。さまざまな状況でthis
はどうなりますか?
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
_
Douglas Crockfordがこの問題について言っていることを読んで、彼から引用して JavaScriptプログラミング言語の調査 :
関数はオブジェクトです。他のオブジェクトと同じようにメンバーを含めることができます。これにより、関数に独自のデータテーブルを含めることができます。また、オブジェクトをクラスとして機能させ、コンストラクターと関連するメソッドのセットを含めることもできます。
関数はオブジェクトのメンバーになることができます。関数がオブジェクトのメンバーである場合、メソッドと呼ばれます。オブジェクトのメソッドが呼び出されたときにオブジェクトに設定される、これと呼ばれる特別な変数があります。
たとえば、式foo.bar()で、this変数は関数barの一種の追加引数としてオブジェクトfooに設定されます。ファンクションバーはこれを参照して、目的のオブジェクトにアクセスできます。
Do.re.mi.fa()などのより深い式では、this変数はオブジェクトdoではなくオブジェクトdo.re.miに設定されます。単純な関数呼び出しでは、これはグローバルオブジェクト(別名ウィンドウ)に設定されますが、これはあまり役に立ちません。正しい動作は、特に内部関数を呼び出すときに、これの現在の値を保持することでした。
また、「this」は、関数の呼び出し方法に応じて変わる可能性があり、 apply function および call function を読んでください。
here からリンクされた彼の(無料の)プレゼンテーションでJavaScriptの最大の精神の1つを学ぶことに時間を費やすことをお勧めします。
JavaScriptの規則(およびこれは単なる規則です)では、大文字で始まる関数はコンストラクターとして使用されます。次に、1つを呼び出します
var foo = new Foo()
およびthis
は、foo
によって参照されようとしている新しく作成されたオブジェクトを参照します。
もちろん、Foo()
を単独で呼び出すことを妨げるものはありません。その場合、this
は関数が呼び出されたオブジェクトを参照します。混乱を避けるため、これは推奨されません。
その関数の使用方法に依存します。関数を使用できる基本的なタイプは2つあります
一つずつ見る
1.機能
var example = function () {
console.log(this);
};
example();
Output : window
ここで、「this」キーワードはウィンドウオブジェクトを指します。
デフォルトでは、これは常にルート-グローバルスコープを参照するウィンドウオブジェクトである必要があります。したがって、console.log(this);関数は、ウィンドウによって呼び出されるため(単に呼び出されるだけです)、この値がウィンドウオブジェクトになることを期待する必要があります。
2.オブジェクトとしての機能
var example = function () {
console.log(this);
};
var obj = new example();
Output : example {}
ここで、「this」キーワードは、新しく作成されたサンプルオブジェクトを指します。
JavaScriptでは、すべてがオブジェクトですら関数です。あなたが言う時 this.foo
次のコード
function Foo()
{
this.foo = "bar"; // <- What is "this" here?
}
foo
はFoo
オブジェクトのメンバー変数になります