这是我在JavaScript学习中偶然发现的最奇怪的行为之一,
这是一个例子:
function multiplier(factor) {
return function(number) {
return number * factor;
};
}
var twice = multiplier(2);
console.log(twice(5));
// → 10
这是从书Eloquent JavaScript中取得的一个例子,作者以一种令人困惑的方式解释它,这使得它更奇怪:
在该示例中,乘数返回一个冻结的代码块 存储在两次变量中。最后一行然后调用值 这个变量导致冻结的代码(返回数*因子;) 活性。它仍然可以访问因子变量 创建它的乘数调用,此外它可以访问 5,通过它的数字解冻它时通过的论点 参数。
任何人都可以解释multiplier
twice()
函数的第二次调用
将参数分配给嵌套函数,如果有更多嵌套函数,该概念和规则是什么呢?
答案 0 :(得分:0)
乘数函数返回其中的函数。因此,在第一次调用中twice
将等于乘数函数返回的函数,如下所示:
twice = function(number) {
return number * factor;
};
这里factor
的值是2
,它在第一次调用中传递给乘法器函数,即使在执行后也可以在其中的函数中访问,这是{{twice(5)
的概念。 3}}。
第二次,当您致电5
时,它会返回twice
的产品,该产品会传递给factor
和10
,这是在第一次调用中之前传递的。因此,产品为$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))