为什么名字是'let'在JavaScript中选择块作用域变量声明?

我理解为什么var取这个名字——它是变量,const——它是常量,但是作用于当前块的let名字背后的含义是什么?顺其自然?

134766 次浏览

我想这是遵循数学传统的。在数学中,我们常说"设x为任意实数"之类的。

它的作用与var的作用完全相同。现在它不能使用var这个名称,因为这个名称已经被使用了。

所以它看起来已经采取了下一个最好的名字,在一个有趣的英语语言结构中有一个语义。

let myPet = 'dog';

在英语中它说“让我的宠物是一只狗”

Let是早期编程语言(如Scheme和Basic)采用的数学语句。变量被认为是低级实体,不适合高级抽象,因此许多语言设计者希望引入类似但更强大的概念,如Clojure, f#, Scala,其中let可能意味着一个值,或可以赋值但不能更改的变量,这反过来让编译器捕捉更多的编程错误并更好地优化代码。

JavaScript从一开始就有var,所以他们只需要另一个关键字,并且只是从几十种其他语言中借用了let作为尽可能接近var的传统关键字,尽管在JavaScript中let创建的是块作用域局部变量。

最有可能的是,这是最地道的选择。它不仅讲起来容易,而且很容易理解。有些人可能会争辩,甚至比var更甚。

但我觉得这事还有更久远的历史。

维基百科:

Dana Scott的LCF语言是lambda演算向现代函数语言演变的一个阶段。这种语言引入了let表达式,从那时起,它就出现在大多数函数式语言中。

全状态命令式语言,如ALGOL和Pascal,本质上是在块结构中实现let表达式,以实现有限范围的函数。

我愿意相信这对Javascript中的let也是一种启发。

添加到酷书制造的反应之后,关键字的数学用法也很好地封装了在Javascript/ES6中使用let的作用域含义。具体来说,就像下面的ES6代码没有意识到一样,在toPrint 的花括号中赋值,它打印出'Hello World'的值,

let toPrint = 'Hello World.';
{
let toPrint = 'Goodbye World.';
}
console.log(toPrint); // Prints 'Hello World'

在形式化数学(尤其是证明的写作)中使用,表明变量的当前实例仅存在于该逻辑思想的范围内。在下面的例子中,x在进入新思想时立即获得了一个新的身份(通常这些是证明主要思想所必需的概念),并在子证明结束时立即恢复到旧的x。当然,就像在编码中一样,这被认为有点混乱,所以通常通过为另一个变量选择不同的名称来避免。

设x为某某…

 证明的东西

新想法{让x变成别的东西……证明某事结论新想法

用旧x证明主要思想

Let使用更直接的块级有限作用域,而var通常是函数作用域或全局作用域。

之所以选择let,似乎是因为在许多其他语言中都可以找到它来定义变量,例如BASIC和许多其他语言。

我认为JavaScript对Scheme的亏欠是显而易见的。Scheme不仅有let,还有let*、let*-values、let-syntax和let-values。(参见方案编程语言,第4版)。

(这个选择进一步证明了JavaScript是Lispy,但是——在我们失去理智之前——并不是同源的。))))

它也可以指“词汇环境类型或绑定”之类的东西。让我感到困扰的是,它只是“让”。让rec在微积分中没有意义。