我在codeproject上找到了这个闭包的例子,但它没有解释它是如何工作的。
function getMultiplier(multiplyBy){
function multiply(num){
return multiplyBy * num;
}
return multiply;
}
var multiplyByTwo = getMultiplier(2);
var multiplyByTen = getMultiplier(10);
var twoIntoFive = multiplyByTwo(5);
var tenIntoSix = multiplyByTen(6);
console.log(twoIntoFive); // 10
console.log(tenIntoSix); // 60

现在我将假设,我的C大脑正在发生什么。请纠正我或给出你的解释。
答案 0 :(得分:1)
实际上multiply
只是一个函数而不是OOP方法。
基本上,函数是对象,但是可以调用。在这种情况下,如果一个函数是一个对象,那么这不是一个问题,如果你可以移交一个函数的引用,那就更多了。这可以通过return multiply
完成。
使用参数值调用getMultiplier
后,将存储该值并返回(并分配)函数。
然后你需要调用该函数,该引用存储在multiplyByTwo
。
局部变量multiplyBy
用于返回结果。没有创建对象。
答案 1 :(得分:0)
有趣的问题。
几乎正确,除了在基本级别,在javascript中实际上all functions are objects。另外,查看后两个变量twoIntoFive
和tenIntoSix
,multiply()
是getMultiplier()
范围内的独立函数(意味着它还包含对其中变量的引用)功能)。
完全
正确,但请注意,它仍然与getMultiplier
不同。
如this article中所述,javascript创建的接口不是对象,而是创建一个接口,该接口引用了函数内已经声明的变量。
这就是它的工作方式。但是twoIntoFive
实际上调用了引用getMultiplier()
函数参数
正确。
这是正确的。由于您删除了对界面的引用,因此它将被删除。
进一步阅读
在对javascript有疑问时,提及MDN通常是一个好主意。这是我到目前为止阅读的最完整的文档。
如果您在我的回答中发现错误或有其他问题,请随时纠正我或提供一些反馈
答案 2 :(得分:-1)
基本上功能是一种功能。我不会说multiply(num)是一个getMultiplier的方法,它只是在它的体内声明。
也许这样会更容易理解?
var x = function getMultiplier(multiplyBy){
var y = function (num){
return multiplyBy * num;
}
return y;
}
反正。它的工作方式是:调用getMultiplier返回一个“乘法”函数。乘法函数返回multiplyBy * num,但getMultiplier返回一个预先生成的乘法函数的排序,其乘法已被getMultiplier的参数替换。
因此,当你调用getMultiplier(2)时,你在multiplyByTwo变量下得到的是:
function multiply(num){
return 2 * num;
}
由于getMultiplier(num)只是替换返回的乘法函数中的参数,因此您可以将其传递给任何内容,并且不会删除任何内容。