2014-02-07 195 views
1

我試着學習JavaScript,因此我嘗試下面的代碼:JavaScript回調沒有改變範圍?

function repeat(n, action) { 
    for (var i = 0; i < n; i++) { 
     action(); 
    } 
} 
function benchmark() { 
    var start = [], end = [], timings = []; 
    repeat(1000, function() { 
     start.push(Date.now()); 
     // Repeat something 
     end.push(Date.now()); 
    }); 

    for (var i = 0; i < end.length; i++) { 
     timings[i] = end[i] - start[i]; 
    } 

    return timings; 
} 

我現在的問題:我爲什麼可以訪問開始和結束在我的回調?據我瞭解,範圍從基準改爲重複。回調是閉包還是閉包在另一個函數中定義的命名函數?

謝謝!

+1

http://stackoverflow.com/questions/111102/how-do-javascript-closures-work – Mik378

+0

請閱讀:http://stackoverflow.com/questions/111102/how-do-javascript-closures-work – Pawel

+1

@Pawel可能重複我的評論;);) – Mik378

回答

0

簡而言之,您的回調嵌套在benchmark之內,這意味着它可以訪問benchmark關閉內的變量。 repeat不嵌套在benchmark內,因此無法訪問benchmark中的變量。

+0

但是當我在閉包中訪問一個帶有「this」的變量時,範圍改變了? – Gerrit

+0

'this'是指使用它的直接函數 - 因此''benchmark''第一行中使用的'this'不會與'repeat'的第一行中使用的'this'相同。 – kaspermoerch

+0

但是,爲什麼this.startin benchmark()不會指向與var start = [];相同的值。 – Gerrit

0

要了解您必須瞭解closure的概念。

瓶蓋通常與特殊的數據結構,它 包含一個指向函數的代碼,再加上 函數的詞法環境的表示實現(即,可用的變量集中)在時刻 當閉合創建

在你的情況,這是在重複調用的回調(動作)是關閉和它的詞法環境中,你有起點,終點,計時和所有可用的全局變量。

0

但是當我在閉包中訪問一個帶有「this」的變量時,範圍改變了?如果我通過this.start = []初始化會發生什麼?第一行重複函數中的數組?