Javascript不支持按引用传递(尽管对象是按引用传递的,只要没有使用赋值操作符例如=
覆盖引用,引用就会保持不变),但您可以使用以下技术模拟C#的ref
关键字:
function test(obj) {
obj.Value = {};
}
var my_obj = { name: 'foo' };
(function ()
{
my_obj = {Value: my_obj};
var $return = test(my_obj);
my_obj = my_obj.Value;
return $return;
}).call(this);
alert(my_obj.name);
当然,你可以使用全局变量并调用没有参数的函数,在这种情况下,引用不会被忽略,如下所示:
var obj = { name: 'foo' };
function test() {
obj = {};
}
test();
alert(obj.name);
如果你所有的代码都在闭包中,那么像全局变量这样的东西就不会污染全局命名空间。
(function(){
var obj = { name: 'foo' };
function test() {
obj = {};
}
test();
alert(obj.name);
}).call(this);
以上的“闭包内全局变量”技巧很适合将具有ref参数的C#代码移植到Javascript中。例如以下的C#代码:
void MainLoop()
{
MyStruct pt1 = CreateMyStruct(1);
MyStruct pt2 = CreateMyStruct(2);
SwapPoints(ref pt1, ref pt2);
}
void SwapPoints(ref MyStruct pt1, ref MyStruct pt2)
{
MyStruct tmp = pt1;
pt1 = pt2;
pt2 = tmp;
}
可以使用类似以下的方式将其移植到Javascript:
(function(){
var pt1, pt2;
function CreateMyStruct(myvar)
{
return {"myvar":myvar}
}
function MainLoop()
{
pt1 = CreateMyStruct(1);
pt2 = CreateMyStruct(2);
console.log("ORIG:",pt1,pt2);
SwapPoints();
console.log("SWAPPED:",pt1,pt2);
}
function SwapPoints()
{
var tmp = pt1;
pt1 = pt2;
pt2 = tmp;
}
MainLoop();
}).call(this);
如果必须使用局部变量和函数参数,那么可以基于我答案中的第一个示例来解决问题,像这样:
(function(){
function CreateMyStruct(myvar)
{
return {"myvar":myvar}
}
function MainLoop()
{
var pt1 = CreateMyStruct(1);
var pt2 = CreateMyStruct(2);
console.log("ORIG:",pt1,pt2);
(function ()
{
pt1 = {Value: pt1};
pt2 = {Value: pt2};
var $return = SwapPoints(pt1, pt2);
pt1 = pt1.Value;
pt2 = pt2.Value;
return $return;
}).call(this);
console.log("SWAPPED:",pt1,pt2);
}
function SwapPoints(pt1, pt2)
{
var tmp = pt1.Value;
pt1.Value = pt2.Value;
pt2.Value = tmp;
}
MainLoop();
}).call(this);
真的不得不说,当Javascript没有本地支持ref
时,它缺少很多!代码会简单得多。
currentObject
如何改变$scope.countries
-> http://jsfiddle.net/ay1wpr5L/2/ - CodyBugstein