今天在给Html控件注册事件的时候,发生了奇怪的现象
最初的代码,
$(document).ready(function () {
$("#blog1" ).click(function () { setTab('blog', 1,5) });
$("#blog2" ).click(function () { setTab('blog', 2,5) });
$("#blog3" ).click(function () { setTab('blog', 3,5) });
$("#blog4" ).click(function () { setTab('blog', 4,5) });
function setTab(tab, cursel, n) {
for (i = 1; i < n; i++) {
var menu = document.getElementById(tab + i);
var con = document.getElementById("displayBlog" + i)
menu.className = i == cursel ? "however" : "";
con.style.display = i == cursel ? "block" : "none";
}
}
});
正常工作,可现在的 blog的控件可能是变化的,于是我做了修改
$(document).ready(function () {
var _blogs= $("#Blogs").find("li[id*='blog']");
for(i=1 ;i<=_blogs.length;i++)
{
$("#blog" + i).click(function () { setTab('blog', i.toString(), _blogs.length + 1) });
}
function setTab(tab, cursel, n) {
for (i = 1; i < n; i++) {
var menu = document.getElementById(tab + i);
var con = document.getElementById("displayBlog" + i)
menu.className = i == cursel ? "however" : "";
con.style.display = i == cursel ? "block" : "none";
}
}
});
结果发现,setTab 函数发生时 cursel的值总是blog控件的个数,
很郁闷,询问同事
闭包作怪。
修改代码
$(document).ready(function () {
var _blogs= $("#Blogs").find("li[id*='blog']");
for(i=1 ;i<=_blogs.length;i++)
{
(function(cu){
$("#blog" + cu).click(function () { setTab('blog', cu.toString(), _blogs.length + 1) });
})(i);
}
function setTab(tab, cursel, n) {
for (i = 1; i < n; i++) {
var menu = document.getElementById(tab + i);
var con = document.getElementById("displayBlog" + i)
menu.className = i == cursel ? "however" : "";
con.style.display = i == cursel ? "block" : "none";
}
}
});
正常工作。
关于闭包:
http://www.cn-cuckoo.com/2007/08/01/understand-javascript-closures-72.html#clClose
或者百度,google里面输入 javascript 闭包.