【发布时间】:2018-08-11 06:30:27
【问题描述】:
Tcl 的uplevel 命令将eval 提供的字符串放在比当前子例程更高的堆栈帧中。
在 Javascript 中有没有等价物?
【问题讨论】:
-
我不这么认为。
标签: javascript stack tcl eval
Tcl 的uplevel 命令将eval 提供的字符串放在比当前子例程更高的堆栈帧中。
在 Javascript 中有没有等价物?
【问题讨论】:
标签: javascript stack tcl eval
在 Tcl 中使用uplevel 的最常见情况是在 JS 中通过让调用者传入一个匿名函数来完成的。 (有时需要对变量范围进行欺骗。)
proc iterSquares {var script} {
upvar 1 $var v
for {set i 0} {$i <= 10} {incr i} {
set v [expr {$i ** 2}]
uplevel 1 $script
}
}
iterSquares x {
puts "I've got a $x"
}
function iterSquares(callback) {
for (var i = 0; i <= 10; i++) {
callback(i ** 2);
}
}
iterSquares(function(x) {
console.log("I've got a", x);
});
但是没有真正的等价于更一般的形式,它们在很多方面更像 Lisp 宏扩展(尽管也不相同)。
【讨论】:
upvar 或uplevel 的级别参数不是1(调用者的上下文)或#0(全局上下文),或者带有变量名或脚本这不是由调用者简单提供的,当心,因为代码正在做一些在大多数其他语言中无法真正描述的棘手事情。您可能还会看到 0(当前上下文)和 upvar 用于执行局部变量别名,但由于不同的基本对象模型,您可能不想在 Javascript 中复制它们。