2017-03-14 143 views
1
function add() { 
    var counter = 0; 
    counter += 1; 
    return counter 
} 

爲什麼第一次迭代後計數器變量不會增加?輸出始終爲1功能範圍變量不可寫

+6

因爲你在0每次初始化...該代碼究竟是幹什麼的你認爲它的確如此。 –

+0

你在裏面聲明瞭一個新的'計數器'變量,並且總是把它設置爲0.每次你調用這個函數時,它總是會重置爲0並且遞增1,然後返回1 –

+0

爲什麼變量計數器的新狀態沒有保存在重新賦值變量 – ak2229

回答

6

add函數返回在函數add內定義的變量counter。變量counter的範圍對於函數是局部的,這意味着每次調用該函數時,都會創建一個新變量counter,然後初始化爲零,然後遞增計數器。

如果您正在尋找計數器實現,則每次都需要引用相同的counter變量並增加該變量。這可以通過使用閉包來實現。

示例:在下面的示例中,有2個函數,1個嵌套在另一個函數內。內部函數保持對外部函數Environment的引用,在這種情況下包含變量counter。所以,即使在控件移出函數add之後,內部函數仍然保持對變量counter的引用。

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

 
document 
 
    .querySelector('#btn') 
 
    .addEventListener('click', function(){ 
 
    document.querySelector('#output').textContent = add(); 
 
    });
<div id="output">0</div> 
 
<button id="btn">Increment</button>

+0

...或者初始化函數外的變量... –

+1

@JeremyThille Agalo說這是一個閉包。閉包使用在父範圍中聲明的變量。 –

+0

'var counter;函數add(){counter + = 1; return counter;}'和'(function(){var counter = 0; return function add(){counter + = 1; return counter;};}())' – Shilly

0

可以使計數器一個全局變量,然後調用add函數:

function add(){ 
    counter = counter + 1; 
} 
0

這是一個範圍的問題。將其更改爲

let counter = 0; 
function add() { 
    counter += 1; 
    return counter 
} 

或者,如果你希望能夠做加(),使用嵌套函數

function adder() { 
    let counter = 0; 
    return function plus() { 
    return counter += 1; 
    }; 
} 
let add = adder(); 
console.log(add()); 
console.log(add()); 
console.log(add());