2016-10-02 54 views
0

我正在读能言善辩JS和寻找澄清这一段代码:分配给在Javascript变量函数的附加参数受封

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

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

我了解封概念,但我被卡在最后一行中的方式是twice(5)。 Eloquent JS says:

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

是”额外的访问“的论点5当解冻关闭功能时通过?当两次是一个变量时,这是如何工作的?

+0

返回的唯一的事情就是里面是什么返回关键字后函数的大括号。 – Kunok

+0

@Kunok,不仅。它也可以访问“因素”。 –

+0

是的,它返回表达式:'number * factor'。你可以把它看成一个单一的东西,因为一旦它被执行,它就是一个单一的值,一个表达式的结果。 – Kunok

回答

1

如果你命名内部函数并检查devtools,它应该更有意义。

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

分配时的两倍乘法器被称为返回内部函数 因为JavaScript具有头等函数它们可以围绕通过并由参考指定给变量

var twice = multiplier(2) 

现在innerMultiplier被分配给twice变量,但它仍然是一个可以调用的函数。

当您运行twice(5)你调用innerMultiplierfactor锁定在它的闭合

这就是吹罚为讨好部分应用程序

+0

这只是咖啡因,而不是部分应用。部分应用程序在多参数函数的上下文中只有意义,如'const mul =(x,y)=> x * y'。 – ftor

+0

命名内部函数有很大帮助。谢谢@ synthet1c。 – dho

0

我一开始对这个语法感到困惑,好吧,但不要害怕! '两次'变量被分配给一个称为闭包的特殊函数类型,它可以访问包含函数的作用域,全局作用域和它自己的变量。但我不认为这是混乱的真正根源,而只是你如何称呼关闭。为了更好地理解,我只需简单地console.log()你的“两次”变量。你会看到,它看上去就像一个正常的功能:

function (number) { 
     return number * factor; 
} 

就像我上眼以上,两次(2)将返回4,因为“因子”是包含范围内,而它们恰巧是乘数功能,并具有2.在你的问题的值,则两次变量其实并不是在所有

console.log(multiplier(2)(2)); 

希望必要的,有助于清楚的事情了!

+0

非常感谢@splay。这有很大帮助。 – dho

相关问题