求问一个javascript很变态的问题~~~(js函数到底是引用传递还是值传递?
//LoadNecessariesvarv1=[]varv2=[];varv3={};functionfoo(v1,v2,v3){v1=[1];v2.x=2;v2.pus...
// Load Necessaries
var v1 = []
var v2 = [];
var v3 = {};
function foo(v1, v2, v3)
{
v1 = [1];
v2.x = 2;
v2.push(22);
v3 = {a:3}
}
foo(v1, v2, v3);
console.log (v1); // []
console.log (v2); // 这里面有 2 也有 22
console.log (v3.a); // undefined 展开
var v1 = []
var v2 = [];
var v3 = {};
function foo(v1, v2, v3)
{
v1 = [1];
v2.x = 2;
v2.push(22);
v3 = {a:3}
}
foo(v1, v2, v3);
console.log (v1); // []
console.log (v2); // 这里面有 2 也有 22
console.log (v3.a); // undefined 展开
5个回答
展开全部
var globleVar = [1,2,3,4,5];
function doSomething(t){
t.pop();
};
doSomething(globleVar);
console.log(globleVar);
这就是个最好的例子。
1. 定义一个全局变量【数组】, globleVar ;
2. 定义一个方法, 这个方法把传进来的参数 去掉最后一个元素 【array.pop()的作用】。
3. 执行这个方法(参数为全局变量globleVar);
4. 打印全局变量globleVar。
说明:
打印结果, [1,2,3,4].
这说明什么, js是引用传递。
doSomething方法接收到的参数是形参,我操作pop的对象是t.
可是打印结果globleVar还是被pop掉了一个元素。
说明什么 形参t 就是 globleVar的引用。 所以操作t 就是在操作 globleVar。
引用传递,必需地。。。。 无争议!!
这也是这们平时开发时 一定要注意的。 不然很多bug就出来了。
function doSomething(t){
t.pop();
};
doSomething(globleVar);
console.log(globleVar);
这就是个最好的例子。
1. 定义一个全局变量【数组】, globleVar ;
2. 定义一个方法, 这个方法把传进来的参数 去掉最后一个元素 【array.pop()的作用】。
3. 执行这个方法(参数为全局变量globleVar);
4. 打印全局变量globleVar。
说明:
打印结果, [1,2,3,4].
这说明什么, js是引用传递。
doSomething方法接收到的参数是形参,我操作pop的对象是t.
可是打印结果globleVar还是被pop掉了一个元素。
说明什么 形参t 就是 globleVar的引用。 所以操作t 就是在操作 globleVar。
引用传递,必需地。。。。 无争议!!
这也是这们平时开发时 一定要注意的。 不然很多bug就出来了。
展开全部
这个是你自己弄乱套了
变量有一个叫作用域的概念,
函数上的 v1是自己这个范围内,
而外面的var v1是全局的
你弄乱了。
所以
1.v1:[],原因是你对参数赋的值,是没有使用的,你要是v1.push(1); 就会有效果,因为它是引用传递,你这样相当于重析创建了一个数组,所以原有的引用失去了作用,所以外面的v1并不是你里面创建的数组
2.JS的一个写性,凡事在对象后面 直接对未知成员赋值,会导致自动定义这么一个成员
3.这个输出为未定义,解释由第1条来说明。
变量有一个叫作用域的概念,
函数上的 v1是自己这个范围内,
而外面的var v1是全局的
你弄乱了。
所以
1.v1:[],原因是你对参数赋的值,是没有使用的,你要是v1.push(1); 就会有效果,因为它是引用传递,你这样相当于重析创建了一个数组,所以原有的引用失去了作用,所以外面的v1并不是你里面创建的数组
2.JS的一个写性,凡事在对象后面 直接对未知成员赋值,会导致自动定义这么一个成员
3.这个输出为未定义,解释由第1条来说明。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼上 latentguling 兄回答得很对,推荐答案太离谱了,这个问题跟java代码没鸟关系!管理员不懂代码也难怪了,唉。。。
PS:Javascript函数事实上就是引用传递!毋庸置疑!
其实还可以说得更清晰点:
v1 = [1]; 是new了一个数组对象,这等同于 v1 = Array(1); 其实是因为在 foo 函数里创建了一个局部变量,然后将这个局部变量的值赋予给 foo 函数的局部变量 v1,这时候就必须要用 this.v1 才能访问全局的 v1 对象,而 foo 函数中的 v1 是局部变量,所以作用于仅限于 foo 函数内,如果在 foo 函数里输出一下,就不难看出,其实赋值是正确的,只是赋值到了局部变量!
说到 v2.x 那么就很简单了,因为没有创建局部变量,所以默认访问上级作用域的 v2 对象,就等同于 this.v2.x = 2; 这个非常简单,这就是引用传递!
说到 v3 = {a:3}; 就跟 v1 是一样的,只是创建的是一个 Object 对象,这时一个最简单的 JSON 对象,因此也是局部变量,因此必须要用 this.v3 才能访问全局的 v3 对象!
总结:JS真的是引用传递,别傻了!
PS:Javascript函数事实上就是引用传递!毋庸置疑!
其实还可以说得更清晰点:
v1 = [1]; 是new了一个数组对象,这等同于 v1 = Array(1); 其实是因为在 foo 函数里创建了一个局部变量,然后将这个局部变量的值赋予给 foo 函数的局部变量 v1,这时候就必须要用 this.v1 才能访问全局的 v1 对象,而 foo 函数中的 v1 是局部变量,所以作用于仅限于 foo 函数内,如果在 foo 函数里输出一下,就不难看出,其实赋值是正确的,只是赋值到了局部变量!
说到 v2.x 那么就很简单了,因为没有创建局部变量,所以默认访问上级作用域的 v2 对象,就等同于 this.v2.x = 2; 这个非常简单,这就是引用传递!
说到 v3 = {a:3}; 就跟 v1 是一样的,只是创建的是一个 Object 对象,这时一个最简单的 JSON 对象,因此也是局部变量,因此必须要用 this.v3 才能访问全局的 v3 对象!
总结:JS真的是引用传递,别傻了!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
JS对象做为参数传递时肯定是引用传递,方法里面的v1 v2 v3是重新定义的变量,相当于var声明。
上面运行的结果是因为,v1和v3做为局部变量被重新赋值了(删除了对参数的引用),而v2只是使用了引用对象的一个方法
上面运行的结果是因为,v1和v3做为局部变量被重新赋值了(删除了对参数的引用),而v2只是使用了引用对象的一个方法
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
传对象(包括数组、函数)时传引用
传数据类型时传值
传数据类型时传值
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询