由于您使用指针的唯一目的是取消引用它以访问另一个变量,因此您可以将其封装在一个属性中。
function createPointer(read, write) {
return { get value() { return read(); }, set value(v) { return write(v); } };
}
要创建指针,请传递读取和写入指向的变量的访问器方法。
var i;
var p = createPointer(function() { return i; }, function(v) { i = v; });
// p is now a "pointer" to i
要取消引用指针,请访问其值。换句话说,在 C 语言中你会写*p
在这里的地方你写p.value
.
i = "initial";
alert(p.value); // alerts "initial"
p.value = "update";
alert(i); // alerts "update"
p.value += "2";
alert(i); // alerts "update2"
您可以创建指向同一个变量的多个指针。
var q = createPointer(function() { return i; }, function(v) { i = v; });
// q is also a "pointer" to i
alert(q.value); // alerts "update2"
q.value = "written from q";
alert(p.value); // alerts "written from q"
您可以通过简单地用另一个指针覆盖指针变量来更改指针指向的内容。
var j = "other";
q = createPointer(function() { return j; }, function(v) { j = v; });
// q is now a "pointer" to j
您可以通过指针交换两个变量。
function swap(x, y) {
var t = x.value;
x.value = y.value;
y.value = t;
}
让我们使用它们的指针交换 和 的值i
。j
swap(p, q);
alert(i); // alerts "other"
alert(j); // alerts "written from q"
您可以创建指向局部变量的指针。
function example() {
var myVar = "myVar as local variable from example";
var r = createPointer(function() { return myVar; }, function(v) { myVar = v; });
swap(p,r);
alert(i); // alerts "myVar as local variable from example"
alert(myVar); // alerts "other"
}
example();
通过闭包的魔力,这为您提供了一种模拟 malloc 的方法。
function malloc() {
var i;
return createPointer(function() { return i; }, function(v) { i = v; });
}
var p = malloc(); // p points to a variable we just allocated from the heap
p.value = 2; // write a 2 into it
你的魔术也有效:
var flowers = new Misdirection(
createPointer(function() { return flowers; }, function(v) { flowers = v; }));
flowers.abracadabra();
alert(flowers);
function Misdirection(flowers) {
this.abracadabra = function() {
flowers.value = new Rabbit;
};
}
function Rabbit() {
this.toString = function() { return "Eh... what's up doc?" };
}