因此,JavaScript 的一些核心函数概念应该能够提供帮助。首先也是最重要的:为了处理 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 ++))
}
}