ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript: 新しい関数と関数を直接呼び出す場合の類似点と相違点

JavaScript: 新しい関数と関数を直接呼び出す場合の類似点と相違点

高洛峰
高洛峰オリジナル
2016-11-25 14:29:35996ブラウズ

おそらく多くの人はこれに同意しないでしょう。関数の前に new キーワードを追加するということは、オブジェクトをインスタンス化することを意味します。しかし、物事は明らかにそれほど単純ではありません:

function Test() {
this.name = 'Test';
return function() { return true }
}

var test = new Test();テストとは何ですか?
Testオブジェクトですか?間違っている!ここで、test は関数 - function() { return true } で返されます。このとき、 new Test() は Test() と等価です。 new Test() == Test() を使用して両者が等しいかどうかを判定すると false が返されます。 , Javascript For Object Comparison with Functionは参照に基づいているためです。

上記の状況における 2 つの違いをより明確に区別するために、引き続き次のコードを見てください。

var fnT = Test();

var newT = new Test();
fnT は文字列 Test であることは明らかですが、newT はどうでしょうか。はは、最初の例を見て混乱しましたか?実際、現時点では newT は Test オブジェクトです。これには、値が文字列 Test である name という名前のプロパティがあります。

上記の 2 つのコードを通じて、関数の戻り値が従来の意味での値型 (Number、String、Boolean) である場合、新しい関数は関数のインスタンス オブジェクトを返すと推測できます。 if 関数 参照型 (Object、Array、Function) が返された場合、新しい関数は関数を直接呼び出した場合と同じ結果を生成します。これは、Test 関数でさまざまなタイプの値を返すテストによって確認できます。

この点を区別することは実際には非常に重要であり、少なくともオブジェクト指向フレームワークのクラス ライブラリ コードを見るときに混乱が少なくなります。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:HTML5時計次の記事:HTML5時計