2016-07-04 5 views
-1

私は、多くの場合、この機能を使用している:(:enter link description here jQueryのAPIドキュメントごと)コールバックが必要な引数としてノーパラーム関数を渡すと、なぜ動作するのですか?

function (index, value) {...} 

$.each(Ojbect, function)では、関数は2つの引数のために期待するべきです。ほとんどの場合、私は自分の非arg関数を定義します。例えば、値を印刷するだけです。

$.each([1,2,3], function(){ 
    console.log($(this); 
}); 

したがって、$ .eachは引数なしの関数を受け入れます。これは毎日の使用に非常に便利です。しかし、私はこれがOKであると言う公式の文書は見つかりませんでした。そのような仕組みがなぜ機能するのかを心に留めておくだけです。

+1

「this」が配列の各要素を参照するように配列されているのはjQueryです。配列のプロトタイプでネイティブの '.forEach()'を使用している場合は、*しない*ため、コールバックが機能しません。 – Pointy

答えて

2

これは、JavaScript関数呼び出しがどのように機能するかを示します。関数に渡される引数の数は、その関数の定義内のパラメータの数と一致する必要はありません。引数よりもパラメータの数が少ない場合(例のように)、引数の配列のようなオブジェクトを通して、関数内で引き続き引数にアクセスできます。引数よりも多くのパラメータがある場合は、一致する引数のない変数がundefined次のようになります。

[ 
function(){ console.log(arguments); },  // ['foo', 'bar'] 
function(x){ console.log(x, arguments); }, // 'foo' ['foo', 'bar'] 
function(x,y){ console.log(x, y); },  // 'foo' 'bar' 
function(x,y,z){ console.log(x, y, z); }, // 'foo' 'bar' undefined 
]. 

// Call each function with two arguments: 'foo' and 'bar' 
forEach(func => func('foo', 'bar')); 
0

コールバック引数は、設定するかどうかに関係なく、必要に応じて、オプションです。コールバックスコープでアクセスする必要がある場合は、コールバックスコープにアクセスする必要があります。あなたのconsole.logの例では、argsをそのまま残すことができます。これにより、コードが短くて読みやすくなります(使用されていない変数がないため)

0

パラメータでパラメータを定義する必要があるのは、関数で使用する場合のみです。それらを使用しない場合、ベストプラクティスでは定義しないことをお勧めします(実際には、パラメータが定義されていても使用されていない場合は、jshintやjslintなどのJavaScriptコード分析ツールでエラーが報告されます)。

あなたの質問に答えて、あなたの持つ機能を定義することは、まったく問題ありません。

2

Javascriptが関数がファーストクラスの市民であることと、動的言語です。また、関数のパラメータは、配列のようなオブジェクトargumentsの位置付けされた要素にかなり多くの名前が付けられています。

(function() { console.log(arguments) })('a',1,null, 'hey') 

>outputs: ["a", 1, null, "hey"] 

jsのは動的言語なので、それは関数の引数の種類やその数を強制VMのための方法はありません:あなたは0引数を持つ関数を定義し、まだそれに渡されたパラメータの値を見ることができることを考えると

。タイプを指定する方法はありません。たとえば、いずれかです。

Typescriptでは、関数に渡されるパラメータの型と数を強制することができるようなものがサポートされていますが、JavaScriptの仕組みがわかります。

関連する問題