关于ext怪异有关问题:为何小弟我点击不同的对象,得到的值都是一样的
关于ext怪异问题:为何我点击不同的对象,得到的值都是一样的?
先看代码如下:
代码里边有说明了,我再补充下,就是我要实现的效果是点击点此测试a时,要提示a,测试的结果每次都提示b,为什么会这样呢?tmp值不是每循环都不同吗?并且还是局部变量,为什么最终都变成b了呢,如何解决这个问题?请大虾指点,解决问题后,最好还要分析下原因,谢谢
------解决方案--------------------
你犯了一个较老的错误,这个错误类似下面的例子。
先看代码如下:
- 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)/// } }