【问题标题】:eloquent javascript - Closure and Functions雄辩的 javascript - 闭包和函数
【发布时间】:2015-12-10 18:14:08
【问题描述】:

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

稍作改动,我们可以把前面的例子变成一种 创建可乘以任意数量的函数。

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

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

// → 10 The explicit

不需要 wrapValue 示例中的 localVariable,因为 参数本身就是一个局部变量。

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

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

javascript如何知道5 in:

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

【问题讨论】:

    标签: javascript function


    【解决方案1】:

    ES6 版本

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

    让我感到困惑的部分是认为变量“两次”被分配了乘数函数,而不是乘数函数(也是一个函数)的 return

    const twice = multiplier(2);
    

    所以实际分配的是:

    const twice = number => number * 2
    
    twice(2)
    -> 10
    

    【讨论】:

      【解决方案2】:

      可以这样想:

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

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

      【讨论】:

        【解决方案3】:

        我也被这个问题困住了一段时间。这就是它帮助我点击的原因。

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

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

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

        function multiplier(factor) {
          return number => number * factor;
        }
        
        let twice = multiplier(2);
        console.log(twice);
        

        返回:number => number * factor

        这帮助我意识到 两次 被分配了 multiplier 的内部函数。当我不传递参数时,它会返回内部函数本身。当我将一个参数传递给 twice 时,它会成为该内部函数的参数并执行它。

        所以当我尝试这个时:

        console.log(twice());
        

        它试图执行这个函数。它返回 NaN 因为我没有传递 number 的参数。

        所以,当我们这样做时:

        let twice = multiplier(2);
        

        我们将变量 twice 绑定到 multiplier 函数的内部函数,并(有效地)传递了 2 的参数。

        以前的 cmets 更简洁地解释了这个操作,但直到点击它对我来说才有意义。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-25
          • 2016-02-07
          • 2017-03-19
          • 2019-02-16
          • 1970-01-01
          • 1970-01-01
          • 2020-02-11
          • 2021-12-14
          相关资源
          最近更新 更多