web-dev-qa-db-ja.com

この内部関数

私の質問は:

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

私が知ることができることから、Fooがどのように使用されているか、つまり、コンストラクターまたは関数として使用されるかどうかに依存します。さまざまな状況でthisはどうなりますか?

49
Frank T. Icali

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
_
62
Atli

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つを学ぶことに時間を費やすことをお勧めします。

23
Zoran Regvart

JavaScriptの規則(およびこれは単なる規則です)では、大文字で始まる関数はコンストラクターとして使用されます。次に、1つを呼び出します

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

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

7
danben

その関数の使用方法に依存します。関数を使用できる基本的なタイプは2つあります

  1. 関数
  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」キーワードは、新しく作成されたサンプルオブジェクトを指します。

3
dhaker

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

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

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

0
Xinus