雄辩的Java语言,局部变量是参数吗?

时间:2019-04-10 03:00:07

标签: javascript

看到这本书时我正在看书

function multiplier(factor) {
  return number => number * factor;
}
  1. 我知道闭包是访问父函数的局部变量的函数中的函数,但是返回的函数是否仍被视为闭包?
  2. 如果这被视为闭包,则意味着参数也被视为局部变量。这是真的?如果是这样,那么每种编程语言都适用吗?我看到一些帖子说它们并不完全相同。有什么区别?

3 个答案:

答案 0 :(得分:4)

  1. 虽然这确实是闭包的示例,但它也是咖喱函数的示例。

  2. 是的,将带有参数和局部变量的函数添加到调用堆栈中,这在(大多数?)编程语言中是正确的。我不知道哪一种语言都不正确,但是可以用其他语言写出来,所以我敢肯定有人做到了。我要说的是,参数/参数与局部变量之间的主要区别在于该函数可以控制局部变量,而参数则由调用它的对象来控制。您可以在此处看到差异,但它们或多或少是相同的。

// 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);

{}是范围。

https://jsfiddle.net/sheriffderek/z1juda8L/