有关在Head First JavaScript中执行Javascript的问题

时间:2019-05-25 19:08:34

标签: javascript

这是我的第一个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);

2 个答案:

答案 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();实际做什么?

  1. 在第一行的右侧创建一个函数;它的声明分为多行
  2. 该功能已分配给第一行左侧的变量myFunction
  3. 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');
}