JavaScript如何处理嵌套函数中的参数?

时间:2016-12-25 10:39:34

标签: javascript

这是我在JavaScript学习中偶然发现的最奇怪的行为之一,

这是一个例子:

function multiplier(factor) {
  return function(number) {
    return number * factor;
  };
}

var twice = multiplier(2);
console.log(twice(5));
// → 10

这是从书Eloquent JavaScript中取得的一个例子,作者以一种令人困惑的方式解释它,这使得它更奇怪:

  

在该示例中,乘数返回一个冻结的代码块   存储在两次变量中。最后一行然后调用值   这个变量导致冻结的代码(返回数*因子;)   活性。它仍然可以访问因子变量   创建它的乘数调用,此外它可以访问   5,通过它的数字解冻它时通过的论点   参数。

任何人都可以解释multiplier twice()函数的第二次调用 将参数分配给嵌套函数,如果有更多嵌套函数,该概念和规则是什么呢?

2 个答案:

答案 0 :(得分:0)

乘数函数返回其中的函数。因此,在第一次调用中twice将等于乘数函数返回的函数,如下所示:

twice = function(number) {
         return number * factor;
        };

这里factor的值是2,它在第一次调用中传递给乘法器函数,即使在执行后也可以在其中的函数中访问,这是{{twice(5)的概念。 3}}。

第二次,当您致电5时,它会返回twice的产品,该产品会传递给factor10,这是在第一次调用中之前传递的。因此,产品为$qdata = mysqli_query("SELECT * FROM table ORDER BY ID_Lesson"); $rows = array(); if (mysqli_num_rows($qdata) > 0) { // Store all exam based on ID_Lesson ar array while ($data = mysqli_fetch_array($qdata)) { if (!isset($row[$data['ID_Lesson']])) { $rows[$data['ID_Lesson']] = array($data['ID_Lesson'], $data['Exam1'], $data['Exam2']); } else { $rows[$data['ID_Lesson']][] = $data['Exam1']; $rows[$data['ID_Lesson']][] = $data['Exam2']; } } $html = ''; // Print per element as <tr> row foreach ($rows as $k => $row) { $html .= "<tr><td>" . implode("</td><td>", $row) . "</td></tr>"; } }

答案 1 :(得分:0)

本质上,乘数在调用时返回一个函数。因此,当您调用乘数并将其存储两次时,将存储一个函数。 你可以这样看, 当你执行console.log(两次(5)时,它就像你正在执行console.log(乘数(2)(5))