这甚至不会发出警告:
xquery version "3.1";
let $a := 1
let $a := 2
return $a
(: yields 2 in all runtimes I tested :)
为什么(函数式)编程语言允许变量重新声明?我真的只是想了解它背后的理由。我相信,通过在编译步骤拒绝这一点可以进行一些更积极的优化。由于子作用域也知道局部变量,这只会为难以捕捉错误留下更多空间。JavaScript 多年来一直存在这个问题,并最终通过引入和var
来摆脱它。let
const
这是一个可能难以跟踪值的示例。
xquery version "3.1";
let $f := function ($c) {
(: some code ... :)
let $b := $a
let $a := 2
let $c := $b
(: some more code ... :)
return ($a, $b, $c)
}
let $a := 1
return ($a, $f($a), $a)
在评估它之前,您可能想先猜测一下。