我正在学习如何从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以使这个代码工作?谢谢!
答案 0 :(得分:5)
您必须同时调用createDrinkOrder
及其创建的功能,请尝试此操作
(createDrinkOrder(passenger))();
让我们一步一步地了解
createDrinkOrder(passenger)
调用createDrinkOrder
,返回匿名函数(...)()
调用匿名函数答案 1 :(得分:4)
绝对 - 因为你只回来了这个功能 - 你实际上从来没有打过它......试试这个:
createDrinkOrder(passenger)();
希望这有帮助!
答案 2 :(得分: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);
&#13;
答案 3 :(得分:3)
您自己的问题标题基本上就是答案:您已将createDrinkOrder()
函数写为返回其他函数。如果你创建了一个函数但从不调用它,那么该函数就不会做任何事情。
您不需要像serveOnePassenger()
函数中那样涉及变量。您可以创建该函数并使用一个语句调用它:
createDrinkOrder(passenger)();
调用createDrinkOrder()
,然后立即将返回的值用作函数。
答案 4 :(得分:1)
createDrinkOrder
正在返回一个函数对象。第三行代码调用createDrinkOrder
,它返回一个函数,但从不调用返回的函数。您不一定需要将createDrinkOrder
返回的值赋给变量,但是您需要确保调用它返回的函数。你可以这样做而不使用变量:createDrinkOrder(passenger)();