Group
関数はコンストラクターとして使用されています。あなたの直感は基本的に正しいです。
ローカル変数を再利用したい場合を除き、 のような無名関数式を使用しない正当な理由はありません。this.showItem = function(args){...};
showItem
どの構文を意味するのかわかりません。はfunction(args){...}
無名関数式であり、this.showItem
は object のメンバーを参照していますthis
。まとめると、「オブジェクトのメンバー関数を設定する」と言えるのではないでしょうか。
showItem
おまけのヒント (すでにご存知でしょうか?):定義の前に使用できる理由は、関数ホイストによるものです。
編集:
関数式と関数宣言、および名前付き関数と無名関数について質問しているようです。主な違いは次のとおりです。
関数宣言は常に独立しています。それらは、割り当てなどの別の操作の一部になることはありません。最初の例では、関数宣言を使用していますfunction showItem(args) {...}
。関数式は、何らかの操作 (代入、引数として渡されるなど) で式として使用されます。2 番目のケースでは、関数式を使用します。
関数宣言は現在の関数スコープの先頭に引き上げられるためshowItem
、最初のケースでは が定義され、代入操作で使用するときに関数が含まれます。関数式は巻き上げられません。
関数宣言には常に名前が付けられます。関数式は、名前付きまたは匿名の場合があります。関数が名前で定義されている場合、その名前はname
関数オブジェクトのプロパティとしてアクセスできます。関数の名前は不変であり、関数への参照を保持する変数から独立しています。また、関数本体内のコードは、ローカル変数としてその名前で関数を参照できます (これは、名前付き関数式内の再帰に役立つ場合があります)。
レビューする:
- 関数定義:
function showItems(args){...};
- 無名関数式:
this.showItems = function(args){...};
- 名前付き関数式:
this.showItems = function showItemsName(args){...};
最初のケースでは、 defined というローカル変数がshowItems
あり、 の定義がshowItems
一番上に持ち上げられています。後者の 2 つのケースの違いは、3 番目のケースと 2 番目のケースではthis.showItems.name
" " になることです。また、関数オブジェクトへの参照を保持する 3 番目の関数の関数本体内のローカル変数になります。showItemsName
undefined
showItemsName