Javascript 为什么赢了';我的函数不能改变对象值吗?
为什么Javascript 为什么赢了';我的函数不能改变对象值吗?,javascript,Javascript,为什么add()函数对列表没有影响?我想创造的是: 函数数组列表(数组){ 列表={}; 函数添加(列表、索引){ if(索引
add()
函数对列表没有影响?我想创造的是:
函数数组列表(数组){
列表={};
函数添加(列表、索引){
if(索引<数组长度){
list={value:array[index],rest:null};
添加(list.rest,索引+1);
}
}
添加(列表,0);
退货清单;
}
您的代码编写时就好像JavaScript是一种按引用传递的语言一样。事实并非如此
具体地说,在add()
函数中,编写代码时,似乎对参数列表进行赋值将对作为参数传递到函数中的内容产生影响;不会的。也就是说,这句话:
list = {value:array[index], rest : null};
将修改参数的值,但不会影响全局变量列表
有不同的方法可以重新设计代码。这里有一个方法:
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);
}
函数数组列表(数组){
函数添加(索引){
var条目=null;
if(索引<数组长度){
entry={value:array[index],rest:add(index+1)};
}
返回条目;
}
返回add(0);
}
您的代码编写时就好像JavaScript是一种按引用传递的语言一样。事实并非如此
具体地说,在add()
函数中,编写代码时,似乎对参数列表进行赋值将对作为参数传递到函数中的内容产生影响;不会的。也就是说,这句话:
list = {value:array[index], rest : null};
将修改参数的值,但不会影响全局变量列表
有不同的方法可以重新设计代码。这里有一个方法:
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);
}
函数数组列表(数组){
函数添加(索引){
var条目=null;
if(索引<数组长度){
entry={value:array[index],rest:add(index+1)};
}
返回条目;
}
返回add(0);
}
首先,您需要在列表
前面打上一个var
,这样您就不会创建全局变量
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;
}
首先,您需要在列表
前面加上一个var
,这样就不会创建全局变量
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;
}
在add中,您可以访问列表变量本身,因为add是一个私有方法。在add中,您可以访问列表变量本身,因为add是一个私有方法。那应该行。既然我不能通过引用传递对象,这是否意味着没有办法绕过它?我尝试了另一种方法,用for循环代替add()函数来做同样的事情,但我尝试用递归来做。@shauryagupta我已经用一个递归的替代方法更新了答案,这个方法应该可以工作。既然我不能通过引用来传递对象,这是否意味着没有办法绕过它?我尝试了另一种方法,用for循环代替add()函数来做同样的事情,但我尝试用递归来做。@shauryagupta我已经用一个递归的替代方法更新了答案,这个方法应该可以工作。