2017-02-09 31 views
1

dev的問了我一個問題,他什麼地方聽說過,他說:爲什麼在函數定義時,閉包允許函數訪問範圍內的外部變量?

閉包允許函數在範圍上,當函數定義

  • 訪問外部變量

    1. 訪問外部變量在範圍上,當函數被調用
  • 答案是當FUNC定義。我試圖圍繞我的頭:

    1. 爲什麼這件事。
    2. 你怎麼知道或測試這個。

    我的問題是:如果在調用閉包時只能控制日誌,那麼如何知道閉包在定義範圍時是否可以訪問外部變量?我希望看到一些證明這一點的代碼。

    第二個問題是:如果這是真的,閉包可以訪問範圍內的外部變量,那麼這會給您帶來什麼好處?爲什麼這很重要?

    +0

    爲什麼「定義」和「被調用」之間的區別很重要,以及如何測試這種區別?或者是什麼? – deceze

    +0

    它可以讓你鎖定私人詞彙價值,提供安全性,輕鬆實現「假全球」 – dandavis

    +0

    @dandavis「安全」...?反對什麼? – deceze

    回答

    2
    function makeCallback() { 
        var foo = 'one'; 
    
        return function() { 
         alert(foo); 
        }; 
    } 
    
    function bar(callback) { 
        var foo = 'two'; 
        callback(); 
    } 
    
    bar(makeCallback()); 
    

    是差的問題在哪裏。如果函數可以訪問調用的範圍中的變量,則會提醒「兩個」。這被稱爲dynamic scoping。但是,由於Javascript使用詞法範圍,它實際上提醒「一個」。

    +0

    這是有道理的。您可能想要更新答案以使其更有意義。 – Johnston

    +1

    我已經刪除了這個潛在的混淆點。現在它可能會令人困惑,因爲關閉是令人困惑的,但是哦......) – deceze

    相關問題