因此,JavaScript有幾個核心功能概念應該能夠提供幫助。首先和formost:爲了處理DOM事件,你可能會想要依賴一個庫,除非你真的有0瀏覽器兼容性的期望。我建議看看jQUery。
這就是說,不顯眼的JavaScript(每@Raynos答案)是綁定的事件在JavaScript中以正確的方式,併爲您提供了很大的靈活性。採取下面的例子:
function setup_events(){
var my_form = document.form[0],
form_name = my_form.name;
my_form.addEventListener("submit", function(event) {
console.log(form_name); // this is retained through the closure.
});
}
你看你可以通過使用閉合的概念,或外部範圍的上下文中,外範圍已從內部範圍內返回後結合數據轉換成事件的功能。現在,當您執行setup_events時,您將綁定submit
事件與一個內部有權訪問外部變量form_name的函數。這可能會產生一些討厭的副作用,如果你不明白的功能範圍,從而尋找出這樣的代碼:
// XXX : BAD CODE
function setup_events(){
var ul = document.getElementsByTagName('ul')[0], // assumes there is a <ul>
count = 0;
for (var li in ul.childNodes) {
li.addEventListener('click', function(event){
alert(count ++); // this will always alert the count of list, not the list position
}
}
}
您可以使用Immediately Invoked Function Expressions創造必要關閉,以保持正確的狀態。因此,「修復」上面的代碼,你會使用類似:
// XXX : BETTER CODE
/**
* NOTE: NEVER CREATE FUNCTIONS INSIDE A LOOP
* this example only shows the immediate solution to the above problem
* with regard to function scope and closures.
*/
function setup_events(){
var ul = document.getElementsByTagName('ul')[0], // assumes there is a <ul>
count = 0;
for (var li in ul.childNodes) {
li.addEventListener('click', (function(count){
return function (event){
alert(count); // this will alert the position in the list
};
})(count ++))
}
}
骨幹非常棒,但它不是一個DOM庫,它是一個代碼結構庫。 jQuery的一個好的替代方法是ender。 (骨幹的一個很好的選擇是脊柱)。第二個例子還有在循環中創建函數的_BIG_問題。這是一個缺乏塊範圍的常見例子,但它僅僅是糟糕的代碼。 – Raynos 2011-05-12 16:16:49
@Raynos我同意在循環中創建函數是不好的代碼,但不想變出另一個使用示例。我會在示例中注意代碼的不好之處。 – Gabriel 2011-05-12 16:20:55
我們需要一個很好的例子來理解塊範圍的問題:)我還沒有找到一個,這只是一個陷阱而不是糟糕的代碼。 – Raynos 2011-05-12 16:24:28