函数与变量之比的原因是什么?
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());
这行不通
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());