• 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