-
2009-10-30
容易被忽略的bug
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://www.my1px.cn/logs/49467396.html
1.IE中,表单元素一旦被创建,其name值就不能被修改。在创建input的时候,很容易忽略掉而成为bug。
如:
var hid = document.createElement('input');
hid.name = 'vvv';
hid.type = 'hidden';
hid.value = '7';
form.appendChild(hid);虽然创建的时候ie不报错,但实际上这个hidden域的name值没有被赋成功
正确做法:
if (isIE) {
var hid = document.createElement('<input name="vvv" >');
} else {
var hid = document.createElement('input');
hid.name = 'vvv';
}
hid.type = 'hidden';
form.appendChild(hid);2.引用玉伯的题目--不写封号引出的问题:
var a = function(t) { return t; }
(1 + 2).toString();
alert(a);解释:因为没有封号引起的,a执行的时候变成function(t) { return t; }(1 + 2),因为结果为3,因此,给每条语句加封号是个好习惯。
3.长天的问题:
function add(num) {
var num;
alert(num);
}
add(1); //结果: 1
function add2(num) {
var num = 2;
alert(num);
}
add2(1); //结果: 2解释:参数定义在 argument对象里函数, var也是定义在 Argument对象里 .可以理解为:function add(var a) { var a; alert(a) },相当于重复定义了a,但定义并没有实际发生存储,所以值还是原来的值,如果另外定义了值,则值会覆盖掉原来的值。
4.不经意的死循环
var arr = [{item:[1,2]},{}];
arr[0].item.push(arr[0]);
你会发现结果是:[{item:[1,2,{{item:[1,2,{item:[1,2,{item:[1,2,{item:[1,2...]}]}]}]}}]},{}];无限循环了。
解释:javascript里,所有对象都是引用传递。语句先执行push动作,存储arr[0]的引用地址到arr[0].item的最后一个元素。在调用时取得数组值时,因为arr[0]已经发生变化,为[1,2,arr[0]],因为又得去取arr[0]形成死递归。
收藏到:Del.icio.us







