雄辩的javascript - 关闭和功能

时间:2015-12-10 18:14:08

标签: javascript function

在雄辩的JavaScript中,作者提供了以下示例+散文:

  

稍作修改后,我们可以将上一个示例转变为一种方式   创建乘以任意数量的函数。

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

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

// → 10 The explicit
  从p开始,不需要来自wrapValue示例的localVariable   参数本身就是一个局部变量。

     

考虑这样的程序需要一些练习。好心理   model是将函数关键字视为“冻结”代码   它的主体并将其包装成一个包(函数值)。所以当   你读取返回函数(...){...},把它想象成返回一个句柄   一段计算,冻结以供以后使用。

     

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

javascript如何知道5中:

console.log(twice(5));

假设是数字的值? JavaScript本质上是在说“我已经有2作为因子的值,我不能改变它,所以5必须是数字的值”。

换句话说

var twice = multiplier(2)

so twice =  multiplier(2) {return function (number)}

thus twice(5) = multiplier(2) {return function (5)}

这是对的吗?

如果乘数中有另一个局部变量,我可以调用:

twice(5,10)

和javascript知道这意味着:

factor = 2
number = 5
third variable = 10

3 个答案:

答案 0 :(得分:1)

将其视为:

var twice = function(number) {
        return number * 2;   
    }; 

当您调用乘数(2)时,您正在创建一个将因子嵌入到该新函数中的新函数。

答案 1 :(得分:1)

我在这个问题上也停留了一段时间。这就是它帮助我点击的原因。

在该书的网站上,您可以与页面上的代码进行交互:

https://eloquentjavascript.net/03_functions.html#p_O3ISvGjNhj

我尝试从两次变量中删除参数:

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

let twice = multiplier(2);
console.log(twice);

此返回:数字=>数字*因子

这帮助我意识到为两倍分配了乘数的内部功能。当我不传递参数时,它将返回内部函数本身。当我将参数传递给两次时,它将成为该内部函数的参数并执行。

所以当我尝试这样做时:

console.log(twice());

它试图执行该功能。它返回 NaN ,因为我没有传递 number 的参数。

所以,当我们这样做时:

let twice = multiplier(2);

我们将变量两次绑定到乘数函数的内部函数,并有效地传递了2个参数。

先前的评论更简洁地解释了此操作,但是直到单击此按钮,对我而言才有意义。

答案 2 :(得分:0)

ES6 VERSION

child(child_here)

困惑我的部分是认为变量'two'被分配了乘数函数,而不是乘数函数的 return (也是函数)。

const multiplier = factor => {
  return number => number * factor;
}

所以实际分配的是:

const twice = multiplier(2);