为什么赢得我的功能更改对象值?

时间:2015-07-22 18:41:31

标签: javascript

为什么add()函数对LIST没有影响?我想要创建的是:enter image description here

function arrayToList(array){
    LIST = {};
    function add(list, index){
        if(index < array.length){
            list = {value:array[index], rest : null};
            add(list.rest, index+1);
        }
    }
    add(LIST,0);
    return LIST;
}

2 个答案:

答案 0 :(得分:6)

您的代码就像JavaScript是一种传递引用语言一样。事实并非如此。

具体来说,在add()函数中,您的代码被编写为好像对参数list进行赋值会对作为参数传递给函数的内容产生影响;它不会。也就是说,这句话:

        list = {value:array[index], rest : null};

将修改参数的值,但不会影响全局变量LIST

您可以通过不同的方式重新设计代码。这是一种方式:

function arrayToList(array){
    function add(index){
        var entry = null;
        if (index < array.length) {
            entry = { value: array[index], rest: add(index + 1) };
        }
        return entry;
    }
    return add(0);
}

答案 1 :(得分:1)

首先,您需要在var前面拍一个LIST,这样就不会创建全局变量。

function arrayToList(array) {
  var LIST = {};
  ...
}

接下来,问题是当您传入list.rest时,您没有传递对该属性的引用。你刚刚传递了null的值。相反,您可能希望尝试在最后创建节点,但将值设置为null

function arrayToList(array) {
  var LIST = {};
  function add(list, index) {
    if (index < array.length) {
      list.value = array[index];
      list.rest = {};
      add(list.rest, index + 1);
    } else {
      list.rest = list.value = null;
    }
  }
  add(LIST, 0);
  return LIST;
}

修改:或者如果您想确定结尾是null,您可以在add函数内执行简单检查。

function add(list, index) {
  if (index < array.length) {
    list.value = array[index];
    if (index + 1 < array.length) {
      list.rest = {};
      add(list.rest, index + 1);
    } else {
      list.rest = null;
    }
  }
}