我们可以传递一个不可变变量的引用作为函数中的参数吗?
例子:
var x = 0;
function a(x)
{
x++;
}
a(x);
alert(x); //Here I want to have 1 instead of 0
我们可以传递一个不可变变量的引用作为函数中的参数吗?
例子:
var x = 0;
function a(x)
{
x++;
}
a(x);
alert(x); //Here I want to have 1 instead of 0
由于 JavaScript 不支持通过引用传递参数,因此您需要将变量设为对象:
var x = {Value: 0};
function a(obj)
{
obj.Value++;
}
a(x);
document.write(x.Value); //Here i want to have 1 instead of 0
在这种情况下,x
是对对象的引用。当x
传递给函数时a
,该引用被复制到obj
. 因此,obj
和x
指内存中相同的东西。更改 的Value
属性obj
会影响 的Value
属性x
。
Javascript 将始终按值传递函数参数。这只是语言的规范。您可以x
在两个函数的本地范围内创建,而根本不传递变量。
这个问题可能有帮助: How to pass variable by reference in javascript? 从返回多个值的 ActiveX 函数读取数据
总而言之,Javascript 原始类型总是按值传递,而对象内部的值是按引用传递的(感谢评论者指出我的疏忽)。所以为了解决这个问题,你必须把你的整数放在一个对象中:
var myobj = {x:0};
function a(obj)
{
obj.x++;
}
a(myobj);
alert(myobj.x); // returns 1
我发现了一种稍微不同的实现指针的方式,从 C 的角度来看,它可能更通用且更容易理解(因此更适合用户示例的格式)。
在 JavaScript 中,就像在 C 中一样,数组变量实际上只是指向数组的指针,因此您可以像声明指针一样使用数组。这样,您代码中的所有指针都可以以相同的方式使用,而不管您在原始对象中为变量命名了什么。
它还允许使用两种不同的符号来表示指针地址和指针地址处的内容。
这是一个示例(我使用下划线表示指针):
var _x = [ 10 ];
function foo(_a){
_a[0] += 10;
}
foo(_x);
console.log(_x[0]);
产量
output: 20
您从 window 对象引用“x”
var x = 0;
function a(key, ref) {
ref = ref || window; // object reference - default window
ref[key]++;
}
a('x'); // string
alert(x);
迟到的答案,但我遇到了一种通过闭包通过引用传递原始值的方法。创建指针相当复杂,但它有效。
function ptr(get, set) {
return { get: get, set: set };
}
function helloWorld(namePtr) {
console.log(namePtr.get());
namePtr.set('jack');
console.log(namePtr.get())
}
var myName = 'joe';
var myNamePtr = ptr(
function () { return myName; },
function (value) { myName = value; }
);
helloWorld(myNamePtr); // joe, jack
console.log(myName); // jack
在 ES6 中,可以缩短代码以使用 lambda 表达式:
var myName = 'joe';
var myNamePtr = ptr(=> myName, v => myName = v);
helloWorld(myNamePtr); // joe, jack
console.log(myName); // jack