作为参数传递给函数的jQuery对象是值复制而不是引用?

时间:2010-09-14 14:19:42

标签: javascript jquery

我的理解:在Javascript对象和数组中作为引用传递而不是函数参数的值。 jQuery组是一个对象,因此应该作为参考传递。

但是我在下面的测试脚本中发现了一些奇怪的事情;除非包含在另一个对象中,否则jQuery组的行为类似于值而非引用...任何人都可以解释这个吗?

<html>
<head>
 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
</head>
<body>
<script>

 function test(arg){
   arg = arg.add($('<span/>'))
   console.log(arg);
 };

 ele = $('<div/>');
 test(ele);  // div + span in the group as expected
 console.log(ele); // only the div - the 'arg' param in function was a copy

 function test2(arg){
   arg.a = arg.a.add($('<span/>'));
   console.log(arg.a);
 };

 obj = {a:ele};
 test2(obj); // div + span in the group as expected
 console.log(obj.a); // both in the group - arg acted like a reference!

</script>
</body>
</html>

2 个答案:

答案 0 :(得分:3)

这是.add()方法的“功能”。它不会修改原始jQuery对象,而是返回一个具有附加值的新对象。

鉴于您的第一个示例,您需要返回arg变量并覆盖ele

 function test(arg){
   arg = arg.add($('<span/>'))
   console.log(arg);
   return arg;  // return the new jQuery object stored in "arg"
 };

 ele = $('<div/>');
 ele = test(ele);  // overwrite the original "ele" with the returned value
 console.log(ele); 

编辑:为了提供另一个插图,使用您的代码,但使用.push()修改原始对象,您会在ele中看到更新的正确值。

 function test(arg){
   arg = arg.push($('<span/>')[0])
   console.log(arg);  // Because .push() is being used, "arg" will reference 
                      //   the new length of the array.
 };

 ele = $('<div/>');
 test(ele);  
 console.log(ele); // Will reference jQuery object with both elements

编辑:最后一次插图。因为.add()返回一个新对象,所以可以更新两个变量以指向相同的值,如下所示:

ele = arg = arg.add($('<span/>'));

现在,而不是ele引用原始文件,而arg引用创建的新对象,两个变量都保存对内存中相同对象的引用。

答案 1 :(得分:0)

您执行的两项测试并不相同。第一个将变量arg设置为值arg.add(...),而第二个设置为名为arg的{​​{1}}上的属性为值a。在JavaScript中传递“通过引用”并不像在其他语言中那样(事实上,有些人不同意它实际上是通过引用传递)。传递类型为对象的变量时,您可以引用其值而不是原始变量。

设置arg.a.add(...)时,您要为arg = arg.add(...)变量设置新值并覆盖其先前的值。这不会修改传入的变量,因为您没有对它的引用,您只能引用它的值(对象)。