2014-11-21 61 views
0

關於閉包的this question的答案表明閉包的重要性是「因爲javascript沒有像命名空間這樣的功能,並且你可以用各種全局對象很容易地搞砸了。」並且msn guide將其描述爲「詞彙範圍」。閉包與命名空間的相關性和使用

而且this question油漆很清楚命名空間和封閉的區別...

所以我想知道,如果使用Javascript實際上確實有命名空間,我一般使用,什麼是時下封閉使用?當我可以通過命名空間來組織和使用它們時,我根本沒有看到需要關閉封閉詞法範圍的變量。

回答

1

JavaScript沒有傳統意義上的命名空間。這只是一個術語,用於描述在對象結構中組織庫的功能。

閉包很有用,因爲庫通常希望將變量存儲在變量中,而無需將這些變量暴露給任何其他代碼。

如果該數據暴露在名稱空間對象上,則庫的用戶很難判斷哪些屬性設計爲與之交互,哪些屬性僅供內部使用。

考慮例如:

var example_namespace = (function() { 
 

 
    var interval; 
 
    var element; 
 

 
    function start() { 
 
    if (interval) { 
 
     return; 
 
    } 
 

 
    if (!element) { 
 
     element = document.querySelector('span'); 
 
    } 
 

 
    interval = setInterval(increment, 500); 
 
    } 
 

 
    function stop() { 
 
    clearInterval(interval); 
 
    interval = null; 
 
    } 
 

 
    function increment() { 
 
    element.innerHTML++; 
 
    } 
 

 
    return { 
 
    counter: { 
 
     start: start, 
 
     stop: stop 
 
    } 
 
    }; 
 
}()); 
 

 
addEventListener('load', function() { 
 
    document.querySelector('#start').addEventListener('click', example_namespace.counter.start); 
 
    document.querySelector('#stop').addEventListener('click', example_namespace.counter.stop); 
 
});
Count: 
 
<span>0</span> 
 

 
<button type="button" id="start">start</button> 
 
<button type="button" id="stop">stop</button>

在不使用一個封閉件,intervalelement,並increment將所有被命名空間物體或全局上露出。

+0

對不起,我沒有看到在你的例子中暴露名稱空間對象上的'interval','element'和'increment'的問題。 – Growler 2014-11-21 20:42:01

+0

揭示它們除了讓它更容易打破它,更難理解外,什麼都不做。 – Quentin 2014-11-21 21:00:35