2016-12-21 9 views
3

JavaScriptの他の関数から関数を返す方法を学んでいます。ここで働く私のコードは次のとおりです。JavaScriptの関数から関数を返す

var passengers = [ 
 
    { name: "Jane", ticket: "coach" }, 
 
    { name: "Evel", ticket: "firstclass" }, 
 
    { name: "John", ticket: "coach" }, 
 
    { name: "Bob", ticket: "premium"} 
 
]; 
 

 
function createDrinkOrder(passenger) { 
 
    var orderFunction; 
 
    if (passenger.ticket === 'firstclass') { 
 
     orderFunction = function() { 
 
      console.log(passenger.name + ', would you like wine or cocktail?'); 
 
     }; 
 
    } else if (passenger.ticket === 'premium') { 
 
     orderFunction = function() { 
 
      console.log(passenger.name + ', would you like some wine?'); 
 
     }; 
 
    } else { 
 
     orderFunction = function() { 
 
      console.log(passenger.name + ', soda or water?'); 
 
     }; 
 
    } 
 
    return orderFunction; 
 
} 
 

 
function serveOnePassenger(passenger) { 
 
    var getDrinkOrderFunction = createDrinkOrder(passenger); 
 
    getDrinkOrderFunction(); 
 
    // createDrinkOrder(passenger); 
 
} 
 

 
// General function to serve passengers: 
 
function servePassengers(passengers) { 
 
    for (var i = 0; i < passengers.length; i++) { 
 
     serveOnePassenger(passengers[i]); 
 
    } 
 
} 
 

 
servePassengers(passengers);

私の質問は、「serverOnePassenger」関数についてです。私は、この関数の最初の2行をコメントアウトし、代わりに第三行のコメントを解除したときに、何もで起こりませんもうコンソール。なぜ私は変数を宣言して関数を代入しなければならないのですか?ありがとう!絶対に

+1

3行目は関数を返していますが、実行していないだけです。 'createDrinkOrder(passenger)()'を試してみてください。 –

+0

呼び出す関数は、関数を実行するまで存在しません – Abdul

答えて

3

あなた自身の質問のタイトルは、基本的な答えです:あなたが何か戻り別の関数としてcreateDrinkOrder()機能を書いています。関数を作成しても呼び出さない場合、関数は何もしません。

serveOnePassenger()のように変数を使用する必要はありません。あなたは、関数を作成し、1文でそれを呼び出すことができます。その後すぐにcreateDrinkOrder()を呼び出し、

createDrinkOrder(passenger)(); 

は、関数として戻り値を使用しています。

+1

ありがとうございました。私は以前この構文を見ましたが、その意味がわかりませんでした。 –

4

- あなただけの機能を取り戻すために - あなたが実際にそれを呼び出すことはありません...代わりにこれを試してみてください:

createDrinkOrder(passenger)(); 

・ホープ、このことができます!

5

あなたは両方createDrinkOrder、それが作成した関数は、これは

(createDrinkOrder(passenger))(); 

のステップで、この工程を経匿名関数を返すcreateDrinkOrder

  • createDrinkOrder(passenger)呼び出しを行ってみましょうしようと呼び出す必要があります
  • (...)()無名関数を呼び出す
+0

ありがとう、ああ!私は今この構文の意味を理解しています。それは両方の方法で今働きます。 –

+0

@mariablairが嬉しいです!私の答えが役に立つのであれば、チェックマークでそれを受け入れることを検討してください。 – akuhn

3

あなたはしません。あなたの問題は、呼び出す関数が別の関数を返すが、実際にテキストを記録する関数は呼び出されないということです。返された関数をcreateDrinkOrder(passenger)()のように呼び出すと、両方の関数が呼び出されます。

var passengers = [ 
 
    { name: "Jane", ticket: "coach" }, 
 
    { name: "Evel", ticket: "firstclass" }, 
 
    { name: "John", ticket: "coach" }, 
 
    { name: "Bob", ticket: "premium"} 
 
]; 
 

 
function createDrinkOrder(passenger) { 
 
    var orderFunction; 
 
    if (passenger.ticket === 'firstclass') { 
 
     orderFunction = function() { 
 
      console.log(passenger.name + ', would you like wine or cocktail?'); 
 
     }; 
 
    } else if (passenger.ticket === 'premium') { 
 
     orderFunction = function() { 
 
      console.log(passenger.name + ', would you like some wine?'); 
 
     }; 
 
    } else { 
 
     orderFunction = function() { 
 
      console.log(passenger.name + ', soda or water?'); 
 
     }; 
 
    } 
 
    return orderFunction; 
 
} 
 

 
function serveOnePassenger(passenger) { 
 
    // var getDrinkOrderFunction = createDrinkOrder(passenger); // Because this returns an anonymous function 
 
    // getDrinkOrderFunction(); // It must be executed to have the expected result 
 
    createDrinkOrder(passenger)(); // This line both returns the function, and executes it. 
 
} 
 

 
// General function to serve passengers: 
 
function servePassengers(passengers) { 
 
    for (var i = 0; i < passengers.length; i++) { 
 
     serveOnePassenger(passengers[i]); 
 
    } 
 
} 
 

 
servePassengers(passengers);

+1

ありがとう!私は今参照してください。 –

1

createDrinkOrderは、関数オブジェクトを返しています。コードの3行目は、関数を返すcreateDrinkOrderを呼び出しますが、返される関数は決して呼び出しません。 createDrinkOrderによって返された値を必ずしも変数に代入する必要はありませんが、返される関数が呼び出されるようにする必要があります。変数を使用せずにこのようにすることができます:createDrinkOrder(passenger)();

+0

ありがとう!私は今参照してください。 –

関連する問題