[英]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 上的功能不起作用,應該歸因於一個變量
您的函數myCounter
只返回一個函數引用。 它不會調用函數plus
。
在您的第一個示例中,您只調用函數myCounter
:
console.log(myCounter());
在第二個示例中,您首先調用返回函數引用的函數myCounter
:
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());
在第二個例子中這一行: var add = myCounter();
使add
var 僅是對函數的引用,如果您將控制台記錄不帶括號的 add var,它將僅打印[Function]
,但console.log(add());
使 add 函數被調用。
為了使第一個示例工作,您可以更改myCounter
計數器函數的返回語句。
此代碼使myCounter
僅返回plus
函數引用:
function myCounter(){
function plus(){
//code
}
return plus;
}
所以為了讓它工作,你應該調用myCounter
兩次:
console.log(myCounter()());
但這使得在從console.log(myCounter())
內部調用(調用) myCounter
時調用plus
函數:
function myCounter(){
function plus(){
//code
}
return plus();
}
你錯過了閉包的概念。 調用myCounter
函數將返回另一個函數,它將在內部初始化“私有”變量counter
,因此myCounter() -> function
。
當然,你可以這樣調用myCounter()()
,但在這種情況下,“私有” 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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.