这是我的第一个stackoverflow帖子!很抱歉,如果我对如何发布协议进行了修改。让我知道是否有:-)
我正在用Head First Javascript完成此练习,但我不知道为什么其他方法无效。
我们遍历乘客以查找机票的类型。根据票证,我们将提供其他警报:头等舱。否则
在本练习中,我们在函数createDrinkOrders处调用一个函数(orderFunction)以提供警报。
如果我在createDrinkOrders中不使用orderFunction,为什么这不起作用?
我删除了createDrinkOrders中的orderFunctions,但它发出了两次或两次警报。如果我在createDrinkOrders中包含orderFunctions,它将发出12次警报。为什么我们在这里需要orderFunctions函数?
我想在迭代之后,无论是否带有orderFunction的警报都会产生相同的结果,但这不是为什么吗?
let passengers = [{
name: "Jane Doloop",
paid: true,
ticket: "coach"
},
{
name: "Dr. Evael",
paid: true,
ticket: "firstclass"
},
{
name: "Sue Propert",
paid: false,
ticket: "firstclass"
},
{
name: "John Funcall",
paid: true,
ticket: "coach"
}
];
function createDrinkOrders(passenger) {
let orderFunction;
if (passenger.ticket === "firstclass") {
orderFunction = function() {
alert("Would you like a cocktail or wine?")
}
} else {
orderFunction = function() {
alert("Your choice is cola or nothing!")
};
}
return orderFunction;
};
function serveCustomer(passenger) {
let getDrinkOrderFunction = createDrinkOrders(passenger);
getDrinkOrderfunction();
getDrinkOrderFunction();
getDrinkOrderFunction();
getDrinkOrderFunction();
};
function servePassengers(passengers) {
for (let i = 0; passengers.length; i++) {
serveCustomer(passengers[i]);
}
};
servePassengers(passengers);
现在代码中没有orderFunction ...请参阅createDrinkOrders(passengers)。
let passengers =[{name: "Jane Doloop", paid: true, ticket: "coach"},
{name: "Dr. Evael", paid: true, ticket: "firstclass"},
{name: "Sue Propert", paid: false, ticket: "firstclass"},
{name: "John Funcall", paid: true, ticket:"coach"}];
function createDrinkOrders(passenger){
if(passenger.ticket === "firstclass"){
alert("Would you like a cocktail or wine?")
}else{
alert("Your choice is cola or nothing!")
}
};
function serveCustomer (passenger){
getDrinkOrderfunction();
getDrinkOrderfunction();
getDrinkOrderfunction();
getDrinkOrderfunction();
};
function servePassengers (passengers){
for(let i = 0; passengers.length; i++){
serveCustomer(passengers[i]);
}
};
servePassengers(passengers);
答案 0 :(得分:2)
在第二个示例中,您正在呼叫createDrinkOrders
let getDrinkOrderfunction = createDrinkOrders(passenger);
,然后通过将其分配给getDrinkOrderfunction
来尝试使用其返回值。
看一下createDrinkOrders
的实现,您会发现它实际上不返回任何内容。因此getDrinkOrderfunction
是值undefined
。
随后的第一个getDrinkOrderfunction()
调用将失败,并引发错误。
createDrinkOrders
的原始代码实际上并未执行alert
-而是向调用者返回了适当的函数(该函数取决于参数)。
如果变量getDrinkOrderfunction
包含一个函数,则可以通过编写getDrinkOrderfunction()
来执行任意多次。这将启动实际的alert
通知。
让我通过简化代码更详细地解释最后一段:
让我们看一下createDrinkOrders
的以下替代实现:
function createDrinkOrders() {
let myFunction = function() {
alert("Hello World");
};
return myFunction;
};
呼叫createDrinkOrders();
实际做什么?
myFunction
myFunction
的值返回给调用方;该值是实际功能!请注意,没有执行createDrinkOrders()
期间创建的内部函数。
怎么看?
如果在产生函数的表达式后附加()
,则函数将被执行。
在创建/声明某些值时,我们总是立即使用它或将其存储在变量中。
正如您可以通过写a+b
在变量中使用数字一样,也可以通过写myFunction
在变量myFunction()
中调用函数。
希望我们现在了解createDrinkOrders()
产生的值实际上是一个函数。
如果我们写
let foobar = createDrinkOrders();
我们现在在变量foobar
中具有该值,可以随时调用它。
foobar(); // call the function stored in foobar
foobar(); // calls it again
答案 1 :(得分:1)
选项1:
function a() {
let b = c(); //calling c() returns a function that can be called later
b(); //alert('q') runs here
b(); //alert('q') runs again here
}
function c() {
return function() {
alert('q');
};
}
选项2:
function a() {
let b = c(); //alert('q') runs here
b(); //throws an error here because b is not defined
b(); //throws an error here because b is not defined
}
function c() {
alert('q');
}