2016-08-26 4 views
4

私はjavascriptを学んでいる間に2つのタイプの機能に遭遇しました。私はそれらを理解するようにそれらを下に置こうとしました。これらの2つのJavaScript関数の違いは何ですか?

function example(arg1, arg2) { //code to do stuff here } 

thing.method(function(arg) { 
    //code to do stuff here 
}); 

私の考えは最初のケースは、2つの引数を取り、ものは中括弧で起こる例という関数を作成していることです。私は関数が呼び出され、範囲内にある限り使用できると信じています(正しい単語だと思います)。

2番目に私は混乱します。私の考えは、メソッド(配列、オブジェクト、何でも)がメソッド(foreach、mapなど)に呼び出された後、私は固執することです。名前がない関数がありますか? 1つの引数をとり、中かっこ内で何かが起こります。そのことが配列であり、foreachという関数を呼び出すと、関数ブラケット内の要素は各要素に発生しますか?なぜ私はちょうど私が呼び出すことができる最初のような関数を作成するよりも、これを使用するのだろうか?

は、なぜ私は言うことができませんでした:

function example(arg) { //stuff } 
thing.method(example(arg)); 

私はいくつかのことを誤解している可能性があります。誰かが私のために物事をクリアすることができるだろうか?

+1

あなたは '言うことができます関数の例(arg){}; thing.method(例); '第2の関数は、基本的に関数の第1引数として関数を送信します。 forEachは、基本的に 'forEachに渡された最初の引数を配列の各要素に使用する'ことを意味するため、配列の各要素に対してその関数を実行します。 – Shilly

+1

これは設計パターンに影響する可能性があります。詳細については、https://scotch.io/bar-talk/4-javascript-design-patterns-you-should-knowを参照してください。これは網羅的なパターンのリストではないことに注意してください。工場パターンは含まれていません。 –

+2

最初のものが正しいです。 2番目はちょっと難しいです。コールバックと呼ばれます。関数(匿名関数、あなたが正しく置くように)を別の関数(thing.method)に渡して、その無名関数をどこかのコードの一部として返すようにします。 – Leandro

答えて

2
thing.method(function(arg) { 
    //code to do stuff here 
}); 

これは匿名関数と呼ばれるものを使用しています。あなたが言ったように、それは名前がありません。これは引数としてthing.method()に渡されます。この例では、あなたがあるためthing.method()example(arg)の戻り値を渡して、代わりのあなたは

function example(arg) { /* stuff */ } 
thing.method(example(arg)); 

としてこれを書き込むことはできません

thing: { 
    method: function(callback) { 
     //... 
     callback(); 
     //... 
    } 
}; 

thing.method()の関数の本体は、次のようなこの機能を使用します関数そのもの。ただし、このようにそれを書くことができます:

function example(arg) { /* stuff */ } 
thing.method(example); 

を今、あなたのような、いくつかの変数を設定し、あなたが渡された関数に渡すmethod()を描くことができます:

thing: { 
    method: function(callback) { 
     var foo = "bar"; 
     //... 
     callback(foo); 
     //... 
    } 
}; 
+0

あなたの答えをありがとう、本当に役に立ちました! – Matt

+0

あなたは大歓迎です! –

1

最初の関数exampleは、JSプログラム全体で再利用可能な名前付き関数です。それはグローバルスコープを持っています。それを使用するには、のようなので、それを呼び出す必要があります。

example(value1, value2); 

これは、関数にvalue1value2を送信すると、いくつかのアクションは、通常、これらの値を使用して実行されます。多くの場合、関数は値を返します。

第2の関数は、匿名関数とコールバック関数の両方です。名前がないため匿名です。イベントが発生したときに呼び出されるだけなので、コールバックがあります。ほとんどの場合、これらの関数はイベント(例えば、clickhoverなど)とともに使用されます。

あなたのメソッドが、例のthingのクリックイベントである可能性があります。ユーザーがthingをクリックすると、無名関数が発生します。スコープはグローバルではなく、アクセス可能なクリックイベントの内部のみです。

// jQuery callback on a click event 
$("#button-in-your-program").click(function() { 
    console.log("Your callback function worked"); 
}); 

これに関連する別のトピックは、クロージャと呼ばれます。クロージャは、関数が呼び出されるたびに作成されるレキシカルスコープです。ほとんどの場合、あなたはそれについて本当に考えていません。しかし、関数を別の関数の中に入れ子にすると、それは重要な概念になります。たとえば、子関数が親関数内の変数を参照する場合は、変数の値を子関数に提供するためにクロージャが使用されます。

関連する問題