1、引言
值传递和址传递在编程中算是最基础的概念了,因此从未将其当回事,甚至很多时候都会不自觉的忽略这些,以至于真正遇见这个问题的时候往往首先排除的就是这个正确答案,很不巧,我又入坑了,为了长教训发出来记录一下。
2、错误及代码
2.1、错误原因
由于习惯了在java中把数据放在对象中,而java中对象类型都是引用数据类型,所以使用其他语言时也无形中受到影响,下意识的把所有类型都当做引用数据类型。
2.2、错误代码
$(function () {
/**
* 用于返回所有id的数据,没有id就添加id并返回id,用于后面对标签进行标记和替换监听函数
*/
function remark(now) {
/**
* 获取标签,优先获取id没有id就获取类名
* @param tag 当前标签,从body开始
* @param now 动态id生成索引 now_id_1开始
*/
function getTag(tag,now) {
var child=tag.children;//获取子标签
console.log('当前标签长度:\t'+child.length);//输出子标签长度
var tmp;
var next;
//有子标签就递归调用,否则结束
if (child.length>0){
next=now;
for (var i = 0; i < child.length; i++) {
//获取并处理当前标签
tmp = child[i];
var id=tmp.id;
if (id){//说明存在id,需要返回当前id给java端
//这里补一个函数返回id数据
console.log('当前标签原始id:\t'+id);
}else {//不存在id就添加id,并把id返回给java端,且返回最终id索引,防止后面id重复
tmp.id='get_id_'+next;
console.log('自增前next=\t'+next);
++next;
console.log('自增后next=\t'+next);
console.log('当前标签动态id:\t'+tmp.id);
}
getTag(tmp,next);
}
}
}
var body=document.body;
getTag(body,now);
}
remark(1);//调用函数获取标记
});
2.3、错误输出
3、正确示例
3.1、正确代码
正确情况下应该把变量放在函数之外,否则因为是值传递,会导致数据错误,放在全局才能显示正确效果。
$(function () {
/**
* 用于返回所有id的数据,没有id就添加id并返回id,用于后面对标签进行标记和替换监听函数
*/
function remark(now) {
var tmp;
var next;//需要递归调用的函数变量放在函数外面,否则非对象类型是进行值传递
/**
* 获取标签,优先获取id没有id就获取类名
* @param tag 当前标签,从body开始
* @param now 动态id生成索引 now_id_1开始
*/
function getTag(tag,now) {
var child=tag.children;//获取子标签
console.log('当前标签长度:\t'+child.length);//输出子标签长度
//有子标签就递归调用,否则结束
if (child.length>0){
next=now;
for (var i = 0; i < child.length; i++) {
//获取并处理当前标签
tmp = child[i];
var id=tmp.id;
if (id){//说明存在id,需要返回当前id给java端
//这里补一个函数返回id数据
console.log('当前标签原始id:\t'+id);
}else {//不存在id就添加id,并把id返回给java端,且返回最终id索引,防止后面id重复
tmp.id='get_id_'+next;
console.log('自增前next=\t'+next);
++next;
console.log('自增后next=\t'+next);
console.log('当前标签动态id:\t'+tmp.id);
}
getTag(tmp,next);
}
}
}
var body=document.body;
getTag(body,now);
}
remark(1);//调用函数获取标记
});