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

Why was the name 'let' chosen for block-scoped variable declarations in JavaScript?

我明白为什么 var 取那个名字 - 它是可变的,const - 它是一个常量,但是 let 这个名字背后的含义是什么,它的范围是当前区块?顺其自然?

我猜它遵循数学传统。数学中常说"let x be arbitrary real number"之类的

它的作用与 var 的作用完全相同,只是范围有所不同。现在它不能使用名称 var,因为它已经被使用了。

看起来它取了次好的名字,它在有趣的英语语言结构中具有语义。

let myPet = 'dog';

英文是"Let my pet be a dog"

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

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

最有可能的是它是最惯用的选择。不仅说起来容易,而且理解起来也很直观。有些人可能会争论,甚至比 var.

但我认为这有更多的历史。

来自Wikipedia

Dana Scott's LCF language was a stage in the evolution of lambda calculus into modern functional languages. This language introduced the let expression, which has appeared in most functional languages since that time.

State-full imperative languages such as ALGOL and Pascal essentially implement a let expression, to implement restricted scope of functions, in block structures.

我想这也是对 Javascript 中 let 的启发。

添加到 ,关键字 let 的数学用法也很好地封装了 let 在 Javascript/ES6 中使用时的作用域含义.具体来说,正如下面的 ES6 代码 不知道 大括号 toPrint 中的赋值 它打印出 'Hello World',

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

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

设x为某某...

‖ 证明材料

‖新想法{让x成为其他东西...证明某事}总结新想法

‖用老x证明主要思想

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

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

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

((这个选择进一步证实了 JavaScript 是 Lispy 的观点,但是——在我们被带走之前——不是谐音。))))

它也可能意味着类似 "Lexical Environment Type or Tied".. 令我困扰的是它只是 "let this be that"。并且 let rec 在 lambda 演算中没有意义。