Javascript的onclick函数调用外部变量的上下文能保存么?

问题可能一句话描述不清楚,先给出代码,大家可以建立一个html文档运行一下:

for (var i = 0; i < 10; i++) {
    var b=document.createElement("button")
    b.textContent=i
    b.onclick=function (e){
        alert("this is "+i)
    }
    document.body.appendChild(b)
}

我想实现的效果是,点5号按钮,弹出对话框就显示this is 5。当然现在无论点击几号按钮都出现this is 10。原因我清楚,但是不知道怎么修改才行。求助各位大大!

阅读 8.7k
5 个回答

尽量不要用闭包,闭包有性能问题.

for (var i = 0; i < 10; i++) {
    var b = document.createElement("button");
    b.index=i;
    b.textContent = i;
    b.onclick = function(){
      alert("this is "+this.index);
    };
    document.body.appendChild(b);
}

i作为参数传过去就可以了:

for (var i = 0; i < 10; i++) {
    var b = document.createElement("button");
    b.textContent = i;
    b.onclick = (function(i){
        return function(e){
            alert("this is " + i);
        }
    })(i);
    document.body.appendChild(b);
}

很奇怪,以下方式居然也不行: for (var i = 0; i < 10; i++) { var b=document.createElement("button"); b.innerText=i; b.onclick=function (e){ alert("this is "+b.innerText); } document.body.appendChild(b); }

我也遇到这样的问题 在使用raphel 一款jquery ui时遇到的 LZ如果解决了 希望分享一下

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏