函数与变量之比的原因是什么?

What is the reason for the ratio of the function to a variable?

这行不通

function myCounter(){
 let counter = 0;
    function plus(){
        counter++;
        return counter;
    }
    return  plus;
}

console.log(myCounter());
console.log(myCounter());

但这行得通

function myCounter(){
 let counter = 0;
    function plus(){
        counter++;
        return counter;
    }
    return  plus;
}
var add = myCounter();

console.log(add());

我知道它们的语法不同。 我的主要问题是: 为什么单独在 console.log 上的函数不起作用,应该归因于一个变量

在第二个示例中,这一行:var add = myCounter(); 使 add var 仅成为对函数的引用,如果您将控制台记录不带括号的 add var,它将仅打印[Function],但是 console.log(add()); 使得添加函数被调用。

为了使第一个示例起作用,您可以更改 myCounter 计数器函数的 return 语句。

此代码使 myCounter 到 return 只有 plus 函数参考:

function myCounter(){
    function plus(){
        //code
    }
    return  plus;
}

因此,为了使其正常工作,您应该调用 myCounter 两次:

console.log(myCounter()());

但这使得 plus 函数在从 console.log(myCounter()) 内部调用(调用)myCounter 时被调用:

function myCounter(){
    function plus(){
        //code
    }
    return plus();
}

您的函数 myCounter 只是 returns 一个函数参考。它不调用函数 plus.

在你的第一个例子中你只调用函数myCounter:

console.log(myCounter());

在你的第二个例子中你首先调用函数myCounter,returns一个函数引用:

var add = myCounter();

然后调用返回的函数:

console.log(add());

解法:

您必须更改此行

return plus;

return plus();

这个有效:

function myCounter(){
    let counter = 0;
    function plus(){
        counter++;
        return counter;
    }
    return plus();
}

console.log(myCounter());

您缺少 closure 概念。调用一个 myCounter 函数会 return 你另一个函数,它会在里面初始化 "private" 变量 counter,所以 myCounter() -> function

当然你可以这样调用myCounter()(),但在这种情况下,"private" counter 变量将在每次调用时初始化为值 0,并且没有用。

解决方案是将 myCounter() 的结果存储在变量中并稍后调用它,这样您就会有预期的行为。

function myCounter(){
  let counter = 0;
  function plus(){
    counter++;
    return counter;
  }
  return  plus;
}

console.log(myCounter()());
console.log(myCounter()());
console.log(myCounter()());

console.log('====')

var add = myCounter();
console.log(add());
console.log(add());
console.log(add());