从JavaScript中的函数返回函数

时间:2016-12-21 21:23:55

标签: javascript function

我正在学习如何从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'的功能:当我在这个函数中注释掉前两行并取消注释第三行时,控制台中没有任何反应。为什么我必须声明一个变量然后为它分配一个函数,然后才调用这个var以使这个代码工作?谢谢!

5 个答案:

答案 0 :(得分:5)

您必须同时调用createDrinkOrder及其创建的功能,请尝试此操作

(createDrinkOrder(passenger))();

让我们一步一步地了解

  • createDrinkOrder(passenger)调用createDrinkOrder,返回匿名函数
  • (...)()调用匿名函数

答案 1 :(得分:4)

绝对 - 因为你只回来了这个功能 - 你实际上从来没有打过它......试试这个:

createDrinkOrder(passenger)();

希望这有帮助!

答案 2 :(得分:3)

你不是。您的问题是您调用的函数返回另一个函数,但实际记录文本的函数不会被调用。如果你像这样调用返回的函数:createDrinkOrder(passenger)(),它将调用这两个函数。

&#13;
&#13;
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);  
&#13;
&#13;
&#13;

答案 3 :(得分:3)

您自己的问题标题基本上就是答案:您已将createDrinkOrder()函数写为返回其他函数。如果你创建了一个函数但从不调用它,那么该函数就不会做任何事情。

您不需要像serveOnePassenger()函数中那样涉及变量。您可以创建该函数并使用一个语句调用它:

  createDrinkOrder(passenger)();

调用createDrinkOrder(),然后立即将返回的值用作函数。

答案 4 :(得分:1)

createDrinkOrder正在返回一个函数对象。第三行代码调用createDrinkOrder,它返回一个函数,但从不调用返回的函数。您不一定需要将createDrinkOrder返回的值赋给变量,但是您需要确保调用它返回的函数。你可以这样做而不使用变量:createDrinkOrder(passenger)();