3

JavaScript 関数に属性または値を追加することは許容されますか?

例:

var f = 1;

function foo (param) {
    f++;
}

var fooFunc = foo;

fooFunc.dummy = f;

console.log('fooFunc: ' + fooFunc);
console.log('fooFunc.dummy: ' + fooFunc.dummy);

上記の例では、関数 ( foo) を作成し、それを新しい変数 ( ) に割り当ててから、属性を にfooFunc追加します。dummyfooFunc

この例を実行すると、最初に関数のテキストが出力され、次に期待値 (1この場合) が出力されます。dummy関数を印刷するとき、値の表示はありません。

fooFunc: function foo(param) {
    f++;
}
fooFunc.dummy: 1 

JsFiddle はこちら - ブラウザの JavaScript コンソールを開いてログ メッセージを表示します: http://jsfiddle.net/nwinkler/BwvLf/

なぜこれが機能するのですか?属性はどこにdummy保存されていますか?関数をログに記録したときに出力されないのはなぜですか?

最後に、これが機能する場合でも、これを使用することは良い考え (または許容される慣行) ですか? これについてオープンエンドの議論を開始したくはありませんが、これの使用方法が文書化されているかどうか、または JavaScript コーディングガイドラインでこれを思いとどまらせる人々がいるかどうかを確認してください。

4

3 に答える 3

3

JavaScript のプリミティブ ( null、undefined、number、string、boolean ) を除くすべてがオブジェクトです。したがって、関数は基本的にオブジェクトです。

JavaScript のオブジェクトはプロパティとメソッドを持つことができるため、関数も持つことができます。

すべての関数は Function.prototype から継承され、特定のプロパティ ( name 、 length ) とメソッド ( .call 、 .apply ) がこのチェーンを通過します。

キャッシュ情報、呼び出し回数などのプロパティを関数自体に関連付けておくと非常に便利な場合があります。このように使用しても問題はありません。

詳細: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function

于 2013-10-09T09:17:17.533 に答える
2

ECMAScript のドキュメントを見てみましょう (これは、標準の JavaScript が基づいているものです)。3つ目はこちら。それのバージョン:

http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf

第 15 章「ネイティブ ECMAScript オブジェクト」に進みます。15.3 > 関数オブジェクト。

あなたの質問に関して興味深い情報がたくさんありますが、最初に注目する価値があるのは、関数がオブジェクトであることです。 オブジェクトとして、属性があります (定義済みで、自分で割り当てることができます)。たとえば、次を試してください。

console.log('fooFunc.name: ' + fooFunc.name);

あなたの場合、「foo」と表示されるはずです。十分に文書化されているので、標準的な方法として使用できますが、あまり普及しておらず、少し変わっているように見えるかもしれません.

お役に立てれば。

于 2013-10-09T09:18:11.813 に答える
1

「許容できる」かどうかにかかわらず、これは通常のオブジェクトの動作です。

function キーワードを使用することで、実際にはネイティブの定義済み Function() コンストラクターを呼び出しています。他のオブジェクト コンストラクターと同様に、ビルド後にオブジェクトを返します。他のオブジェクトと同様に、返されたオブジェクトには、他の関数をメソッド プロパティとして含むプロパティを含めることができます。

var adder = function(a, b){return a+b};
adder.subtracter = function(a, b){return a-b};
console.log(adder(1,2)); // 3
console.log(adder.subtracter(1,2)); // -1

ヒント: 加算器オブジェクトとその減算器メソッドを見たい場合は、コンソールで上記のコードを実行した後、コンソール ビューから DOM ビューに切り替えてから、「加算器」を検索してください。そこにオブジェクトが表示されます。次に、減算オブジェクトを含む、それが何から作られているかを確認するために折りたたむことができます。

もちろん、関数オブジェクトは特別なネイティブ オブジェクトであり、adder() のような呼び出しを行い、実際にコードを実行することができます。関数オブジェクトがカスタム添付プロパティを検査するのが難しいという事実は、そのネイティブの特別なオブジェクト処理 (組み込みの制限動作を読み取る) と組み合わせて、カスタム プロパティを添付することは可能ですが、意図したものでも、意図したものでもないというヒントを与えるはずです。関数オブジェクトの上手な使い方。

于 2013-10-09T18:02:23.310 に答える