javascript - Head First JavaScript 中关于 Javascript 练习的问题

标签 javascript

这是我的第一篇 stackoverflow 帖子!如果我搞砸了如何发帖的协议(protocol),我很抱歉。如果有请告诉我:-)

我正在 Head First Javascript 中完成这个练习,但我不知道为什么替代方案不起作用。

我们遍历乘客以查找机票类型。根据机票的不同,我们将提供不同的提醒:头等舱或其他舱。

在本练习中,在函数 createDrinkOrders 中,我们调用一个函数 (orderFunction) 以提供警报。

如果我不在 createDrinkOrders 中使用 orderFunctions,为什么这不起作用?

我删除了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);

最佳答案

在第二个示例中,您正在调用 createDrinkOrders

let getDrinkOrderfunction = createDrinkOrders(passenger);

然后尝试通过将其分配给 getDrinkOrderfunction 来使用它的返回值。 看一下 createDrinkOrders 的实现,您会发现它实际上没有返回任何内容。因此,getDrinkOrderfunction 的值是undefined

接下来的第一次调用 getDrinkOrderfunction() 将失败并抛出错误。

createDrinkOrders 的原始代码实际上并不执行 alert - 而是向调用者返回一个正确的函数(哪个函数取决于参数)。 如果变量getDrinkOrderfunction包含一个函数,则可以通过编写getDrinkOrderfunction()来执行任意多次。这将启动实际的警报通知。

让我通过简化代码来更详细地解释最后一段: 让我们看一下 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

关于javascript - Head First JavaScript 中关于 Javascript 练习的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56307905/

相关文章:

javascript - window.onblur 和 console.log 部分应用程序与绑定(bind)

javascript - 使用 jquery 获取外部父 UL

javascript - d3.js 小倍数 map ,每个倍数具有不同的填充国家/地区

java - 有没有人使用过 GWT 并且可以说它确实兑现了它的 promise ?

javascript - rails : How to execute function using a button without reload pages

javascript - 如何避免在主机源index.html上使用脚本标签库cdn链接

javascript - 仅显示具有相同类名的多个 div 标签的不同值的最佳方法

javascript - 预加载一个 DIV

javascript - 使用 JavaScript 在 for 循环中构建对象

javascript - jQuery 按多列过滤表行