【发布时间】:2012-04-23 13:05:07
【问题描述】:
我在 JavaScript 中使用dynamic scoping 模拟pointers 为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)?看起来样板文件太多了。
【问题讨论】:
-
为什么要这样做?一般来说,如果您尝试将 JavaScript 编写为另一种语言,您最终会得到一些非常丑陋的代码。
-
呃,这在很多层面上都是错误的......你有什么特别想解决的问题还是这是一个学术问题?
-
如果您需要没有 eval 的指针,请使用数组。
-
@JamesMcLaughlin - 代码是否丑陋并不重要。它只是我在 JavaScript 之上构建的一种语言的样板(比如 CoffeeScript)。最终用户根本不需要与 JavaScript 样板进行交互。因此,如果它不漂亮也没关系。 =)
-
也许我只是不明白您要解决什么问题。我没有看到 JavaScript 上下文中的指针有任何好处。但我确实看到您使用
eval并使用正则表达式变异字符串化函数体,这是不对的。一方面:内存管理语言中没有“内存位置”。进一步:已经编写了大而复杂的 JS 库,而无需“模拟”指针。这对我来说没有意义,在你指出一个合理的用例之前可能不会。
标签: javascript pointers closures simulate dynamic-scope