首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

关于ext怪异有关问题:为何小弟我点击不同的对象,得到的值都是一样的

2012-11-05 
关于ext怪异问题:为何我点击不同的对象,得到的值都是一样的?先看代码如下:JScript codevar panel Ext.cr

关于ext怪异问题:为何我点击不同的对象,得到的值都是一样的?
先看代码如下:

JScript code
    var panel = Ext.create("Ext.panel.Panel");    var arraytest = ["a","b"];            function test(p){        alert(p);//测试时不管点a,还是b,都是提示b,这不是我想要的    }                    for (var i = 0; i < arraytest.length; i++){        alert(arraytest[i]);        var tmp = arraytest[i];                var testText =         {             xtype: "tbtext",             text: "点此测试:"+tmp,//分别得到两个文本:点此测试a与点此测试b            listeners:             {                click: {                    element: "el",                    fn: function(){                         test(tmp);//当i=0时,tmp="a",当i=1时,tmp="b",分别点击时,应该分别提示a与b ,但是,怪异的是,不管点那个点此测试a或点此测试b,提示的都是为b,而我想要的效果是,点击“此测试a”时,提示a,“点此测试b”时,提示b,怎么解决?                    }                }            }        }                            panel.add(testText);            }


代码里边有说明了,我再补充下,就是我要实现的效果是点击点此测试a时,要提示a,测试的结果每次都提示b,为什么会这样呢?tmp值不是每循环都不同吗?并且还是局部变量,为什么最终都变成b了呢,如何解决这个问题?请大虾指点,解决问题后,最好还要分析下原因,谢谢

[解决办法]
你犯了一个较老的错误,这个错误类似下面的例子。
JScript code
var a=[];for(var i=0;i<3;i++)a.push(function(){alert(i)});a[0]();
[解决办法]
ext4不熟,针对你的问题,用函数委托:
JScript code
for (var i = 0; i < arraytest.length; i++){        testText=function(tmp){            return {                xtype: "tbtext",                text: "点此测试:"+tmp,//分别得到两个文本:点此测试a与点此测试b                listeners:                 {                    click: {                        element: "el",                        fn: function(){                             test(tmp);//当i=0时,tmp="a",当i=1时,tmp="b",分别点击时,应该分别提示a与b ,但是,怪异的是,不管点那个点此测试a或点此测试b,提示的都是为b,而我想要的效果是,点击“此测试a”时,提示a,“点此测试b”时,提示b,怎么解决?                        }                    }                }            }        }(arraytest[i]);        panel.add(testText);              }
[解决办法]
for (var i = 0; i < arraytest.length; i++){
alert(arraytest[i]);
var tmp = arraytest[i];

var testText = 
{
xtype: "tbtext",
text: "点此测试:"+tmp,
myvalue: tmp, 
listeners:
{
click: {
fn: function (obj) {
alert(obj.myvalue);
}
}
}
}
}
panel.add(testText);
}
[解决办法]
闭包没做好。。
JScript code
var testText = {   xtype: "tbtext",   text: "点此测试:" + tmp, //分别得到两个文本:点此测试a与点此测试b   listeners: {   click: {      element: "el",      fn: (function (tmp) {           return function () {/////这里做个闭包,生成一个新函数引用父函数的变量tmp                  test(tmp);           }       })(tmp)///    }} 

热点排行