我理解为什么var
叫这个名字——因为它是变量,const
——因为它是常量,但是let
的名字背后有什么含义呢?而且let
的作用域只在当前代码块内。是让它成为吗?
我理解为什么var
叫这个名字——因为它是变量,const
——因为它是常量,但是let
的名字背后有什么含义呢?而且let
的作用域只在当前代码块内。是让它成为吗?
let
是一个数学语句,早期的编程语言如Scheme和Basic采用了这种语句。变量被认为是低级实体,不适合于更高层次的抽象,因此许多语言设计者希望引入类似但更强大的概念,例如Clojure、F#和Scala中的let
,它可能表示一个值,或者是一个可以赋值但不能更改的变量,从而让编译器能够更好地捕获编程错误并优化代码。
JavaScript从一开始就有var
,所以他们只需要另一个关键字,并从使用let
作为传统关键字的其他几十种语言中借鉴,尽可能接近var
,尽管在JavaScript中,let
创建块作用域局部变量。
len('var') === len('let')
也很好,这意味着你在编辑器中以任一方式声明变量时,它们的长度都会对齐。我尚未发现有什么迹象表明这是有意为之的,但这既可以让代码更加美观易读,也可能在混用两者时导致极其烦人的调试问题(这本来就不是个好主意,但我曾见过这样的情况发生)。 - brichins我想这符合数学传统。在数学中,通常会说“假设x是任意实数”之类的话。
除了exebook的回答之外,关键字let在数学上的使用也很好地封装了在Javascript/ES6中使用let
时的作用域影响。特别是,正如以下ES6代码在打印'Hello World'
的值时,不知道toPrint
括号中的赋值 时,
let toPrint = 'Hello World.';
{
let toPrint = 'Goodbye World.';
}
console.log(toPrint); // Prints 'Hello World'
Let在形式化数学中(尤其是证明的写作中)表示当前变量仅存在于该逻辑思想的范围内。在下面的例子中,x一进入新的概念(通常这些是证明主要思想所必需的概念),就立即获得了一个新的身份,并在子证明结束时立即恢复到旧的x。当然,就像在编码中一样,这被认为有点令人困惑,因此通常通过选择其他名称来避免使用另一个变量的名称。
设x是这样那样的...
证明内容
新思路{设x是其他的东西...证明某些东西} 结束新思路
用旧x证明主要思想
let
的全部意思。let
关注于作用域。 - jinglesthulalet
让我想到代码编写者脑海中正在发生的事情,"好的,就在这一刻,let foo = bar
,但它随后可以回到原始值或停止存在。这在 W3Schools 的 let
展示 中的块级作用域和重新声明变量的示例中得到了很好的说明。再次强调,这不是要提供某种科学答案,而是作为记忆 let
时的助记符。 - AlaintoPrint
的新变量_,然后当块结束时,将该变量扔掉。退出时,我们回到了外部作用域,在那里内部的 toPrint
不再存在,因此 console.log(toPrint)
引用的是 外部 toPrint
。并非有什么被忽略了,只是 let
变量具有由其作用域定义的有限生命周期。 - FeRD它与var
所做的事情完全相同,只是范围不同。现在它不能采用var
这个名称,因为它已经被占用了。
因此,看起来它采用了下一个最好的名称,该名称在一个有趣的英语语言结构中具有语义。
let myPet = 'dog';
用英文说是“让我的宠物变成一只狗”
A$="HELLO WORLD"
)。涉及的解释器包括Rockwell AIM 65 BASIC、Atari Basic、CP/M上的MBASIC 5、Applesoft Basic,甚至是CP/M上的MS BASIC编译器BASCOM。我记得VAX BASIC有LET,但不需要它。当时内存很紧张,每个语句多出3或4个额外的字符在程序文本中会有所不同,尤其是在“大”程序中。 - Peter Hullvar
更加易懂。let
的灵感来源。let
引入JavaScript一样。就其本身而言,这并不完全不真实,但也没有任何真正的意义。(并且并不排除Scott使用“let”的灵感也受到BASIC LET
的影响的可能性。) - FeRD它也可能意味着 "词法环境类型或绑定"。仅仅是让“这个”成为“那个”使我感到困扰。在 lambda 演算中,let rec 没有意义。
let关键字用于更直接的块级限定作用域,而var通常是函数作用域或全局作用域。
看起来let被选择最有可能是因为它在许多其他语言中都被用来定义变量,例如BASIC和许多其他语言。