gpt4 book ai didi

javascript - 有没有更好的方法在 JavaScript 中模拟指针?

转载 作者:行者123 更新时间:2023-11-29 09:56:45 24 4
gpt4 key购买 nike

我正在使用 dynamic scoping模拟 pointers在 JavaScript 中为 follows :

var ptr = (function () {
var ptr = "(" + String(function (value) {
if (value === void 0) return upvalue;
else upvalue = value;
}) + ")";

return function (upvalue) {
return ptr.replace(/upvalue/g, upvalue);
};
}());

function swap(xptr, yptr) {
var t = xptr();
xptr(yptr());
yptr(t);
}

var x = 2;
var y = 3;

alert([x, y]);
swap(eval(ptr("x")), eval(ptr("y")));
alert([x, y]);

是否有任何其他方法可以达到相同的结果(即不求助于 eval)?样板文件似乎太多了。

最佳答案

由于您使用指针的唯一目的是取消引用它以访问另一个变量,因此您可以将它封装在一个属性中。

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;
}

让我们使用指针交换 ij 的值。

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?" };
}

关于javascript - 有没有更好的方法在 JavaScript 中模拟指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10281115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com