2016-12-21 147 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行中的這一功能,並取消對3號線替代,什麼也沒有發生在控制檯了。爲什麼我必須聲明一個變量然後爲它分配一個函數,然後才調用這個變量才能使這個代碼工作?謝謝!

+1

你的第三行是返回一個函數,你只是沒有執行它。嘗試'createDrinkOrder(passenger)()'。 –

+0

您嘗試調用的函數在您執行創建函數之前不存在 – Abdul

回答

3

你自己的問題的標題是基本的答案:你寫的createDrinkOrder()功能的東西,回報其他功能。如果你創建了一個函數,但從來沒有調用它,函數將不會執行任何操作。

你不需要一個變量,因爲你的serveOnePassenger()函數。你可以創建功能,並與一個語句調用它:

createDrinkOrder(passenger)(); 

立即調用createDrinkOrder(),然後使用返回值的函數。

+1

謝謝,它現在總是感覺!我之前看到過這個語法,但我不知道它的含義。 –

4

絕對 - 因爲你只找回功能 - 你從來沒有真正把它...試試這個:

createDrinkOrder(passenger)(); 

希望這有助於!

5

必須調用都createDrinkOrder和它所創建的功能,試試這個

(createDrinkOrder(passenger))(); 

讓我們通過這一步一步

  • createDrinkOrder(passenger)電話createDrinkOrder返回一個匿名函數
  • (...)()呼叫匿名功能
+0

謝謝akuhn!我現在明白這個語法的意思了。它現在兩種方式。 –

+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正在返回一個函數對象。第三行代碼調用createDrinkOrder,它返回一個函數,但從不調用返回的函數。您不一定需要將createDrinkOrder返回的值分配給變量,但您確實需要確保它返回的函數被調用。你可以這樣做,而不使用變量:createDrinkOrder(passenger)();

+0

謝謝!我現在明白了。 –