看到这本书时我正在看书
function multiplier(factor) {
return number => number * factor;
}
答案 0 :(得分:4)
虽然这确实是闭包的示例,但它也是咖喱函数的示例。
是的,将带有参数和局部变量的函数添加到调用堆栈中,这在(大多数?)编程语言中是正确的。我不知道哪一种语言都不正确,但是可以用其他语言写出来,所以我敢肯定有人做到了。我要说的是,参数/参数与局部变量之间的主要区别在于该函数可以控制局部变量,而参数则由调用它的对象来控制。您可以在此处看到差异,但它们或多或少是相同的。
// You'll need to actually look in your dev tools to see the result
const test = test => test2 => test2;
console.log("Test:");
console.dir(test);
console.dir(test());
const best = function(best) {
return function(best2) {
return best2;
}
}
console.log("Best:");
console.dir(best);
console.dir(best());
// You'll need to actually look in your dev tools to see the result
答案 1 :(得分:2)
您在这里提出的问题不止一个,但标题中的问题是javascript中的参数对于使用该函数的函数是否本地。答案是肯定的,再加上所有嵌套函数。
答案 2 :(得分:2)
我担心您过于重视“关闭”。所谓的“关闭”-只是范围存在/或范围边界的地方。 factor成为该函数的局部变量...因此,它在该函数的范围内...-有些人喜欢使用它关闭的概念模型...但是-我看到这种心理模式造成的弊大于利。功能有范围。参数/参数在该函数的范围内。有时,试图为事实命名只是不必要的抽象。但是,如果它对您有用,那也很好。只是不要强迫它。
function multiplier(factor) {
// var factor = undefined; // is how you can think of it
// factor = incomingArgument
console.log('factor:', factor);
return function(number) {
// var number = undefined;
// number = incomingArgument
console.log('number:', number);
return number * factor;
// factor is coming from that outer scope only
}
}
var outer = multiplier;
var inner = multiplier(4);
var outcome = inner(5);
console.log('outer', outer);
console.log('inner', inner);
console.log('outcome', outcome);
从{
到}
是范围。