【问题标题】:What is the equivalent of Tcl's 'uplevel' in Javascript?Javascript 中 Tcl 的“uplevel”等价物是什么?
【发布时间】:2018-08-11 06:30:27
【问题描述】:

Tcl 的uplevel 命令将eval 提供的字符串放在比当前子例程更高的堆栈帧中。

在 Javascript 中有没有等价物?

【问题讨论】:

  • 我不这么认为。

标签: javascript stack tcl eval


【解决方案1】:

在 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 中复制它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 2011-04-23
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多