我知道为什么要使用var
该名称-它是变量,const
-它是一个常数,但是for的名称后面的含义是什么let
,该范围作用于当前块?随它去?
const
是一个常量或不可变(只读)的对象引用,其中对象本身仍然是可变的。例如。声明/分配后const foo = ['bar']
,foo.push('bat')
仍然合法,但foo = ['bar', 'bat']
不是。但这太多了。
我知道为什么要使用var
该名称-它是变量,const
-它是一个常数,但是for的名称后面的含义是什么let
,该范围作用于当前块?随它去?
const
是一个常量或不可变(只读)的对象引用,其中对象本身仍然是可变的。例如。声明/分配后const foo = ['bar']
,foo.push('bat')
仍然合法,但foo = ['bar', 'bat']
不是。但这太多了。
Answers:
Let是早期编程语言(例如Scheme和Basic)采用的数学表达式。变量被认为是不适合较高抽象级别的低级实体,因此许多语言设计人员希望引入类似但功能更强大的概念,例如Clojure,F#,Scala,其中let
可能表示值或可以分配的变量,但未更改,这反过来又使编译器可以捕获更多编程错误并更好地优化代码。
JavaScript var
从一开始就有了,所以他们只需要一个关键字,就从其他几十种let
已经尽可能使用作为传统关键字的语言中借来了var
,尽管在JavaScript中let
创建了块范围局部变量。
len('var') === len('let')
,这意味着您的声明可以在编辑器中很好地对齐。我还没有发现任何暗示这是故意的,但它可能是a)视觉上令人愉悦且更具可读性,或者b)如果将两者混合使用,则令人讨厌的调试工作(无论如何这似乎是一个坏主意,但是我我已经看过了)。
let
传统上一直使用常量来描述常量,let C = the speed of light
因此Javascript决定使用let来描述具有非标准作用域的变量,同时为常量引入另一个关键字。
let
接近var
。另外,Scala不使用,let
所以我看不到它的相关性。
除了对exebook的响应外,关键字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
。 let
是关于范围的。
let
在代码编写者的脑海中,让我想到了这样的事情:“好吧,就目前而言let foo = bar
,但是然后它可以回到其原始值或不再是它的原始值。在区块范围和重新声明变量的例子这W3Schools的演讲中let
,同样,不是假装在某种形式的科学的答案带来的,但分享这更是一个记忆装置,记得当我想用let
。
toPrint
执行赋值,然后在该块结束时将其完全丢掉。退出时,我们返回外部范围,而内部范围toPrint
不再存在,因此console.log(toPrint)
是指external toPrint
。并不是任何事情都会被忽略,仅仅是let
变量的作用域定义了有限的生存期。
它确实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个字符会有所不同,尤其是在“大型”程序中。
最可能的可能性是它是最惯用的选择。不仅说起来容易,而且理解起来很直观。有些人甚至可以争论var
。
但是我认为这还有更多的历史。
从维基百科:
Dana Scott的LCF语言是lambda演算向现代功能语言演变的阶段。该语言引入了let表达式,该表达式自那时以来已出现在大多数功能语言中。
诸如ALGOL和Pascal之类的全状态命令式语言本质上实现了let表达式,以在块结构中实现有限的功能范围。
我想也相信这对于let
Javascript 也是一个启发。
LET
1964
let
JavaScript 的相同方式将let表达式“引入”了lambda演算。就目前而言,这并非完全不真实,但没有任何实际意义。(而不以任何方式排除Scott的“ let”的使用也受到BASIC启发的可能性LET
。)
这也意味着像“词法环境类型或捆绑”。它困扰我,这将仅仅是“让这成为那个 ”。而且让Rec在lambda演算中毫无意义。
LET
。可能有较早的语言示例。