我的理解:在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>
答案 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(...)
变量设置新值并覆盖其先前的值。这不会修改传入的变量,因为您没有对它的引用,您只能引用它的值(对象)。