因此,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