闭包的经典演示

闭包的经典演示

by kixi

HTML

<button>0</button> 
<button>1</button> 
<button>2</button> 
<button>3</button>
<button>kixi.com.cn</button>

CSS

/*
清晰网
kixi.com.cn
从javascript开始
*/

JavaScript

//闭包、作用域链共同作用才能有正确的结果
var button = document.getElementsByTagName("button");

var addEventListener = function(nodes){    
    for(var i = 0; i < nodes.length; i++){
        
                              //另一个作用域链 ↓
        nodes[i].onclick = (function(anotherI){
            return function(){
                alert(anotherI);
            };
        })(i);
    }
}
addEventListener(button);

/* 错误的代码
* 因为javascript是单线程的关系,所以alert总是4,
* 因为js已经跑完了,值已经被刷新了

var button = document.getElementsByTagName("button");
var addEventListener = function(nodes){
    var i;

    for(i = 0; i < nodes.length; i++){
        nodes[i].onclick = function(e){
            alert(i);
        }
    }
}
addEventListener(button);
*/