我正在使用Chrome devtools,并尝试了以下代码:
let = 1;
let x = 2;
console.log(let); // 1
console.log(x); // 2
如果我将“ let”替换为“ var”,则以上代码将不起作用。
我假设let = 1
与var let = 1
相同。如果是这样,let x = 2
是否应该翻译成1 x = 2
并因此出错?
答案 0 :(得分:10)
我假设
CL-USER 2 > (defun split-string (string) (loop for i from 0 below (length string) by 2 collect (subseq string i (+ i 2)))) SPLIT-STRING CL-USER 3 > (split-string "AABBCCDDEEFF") ("AA" "BB" "CC" "DD" "EE" "FF") CL-USER 4 > (mapcar (lambda (s) (parse-integer s :radix 16)) *) (170 187 204 221 238 255)
与let = 1
相同
它声明了一个变量,但不相同。这里的主要区别在于,通过省略诸如var let = 1
,var
或let
之类的声明,您可以全局* 声明此变量(假设您是不设置先前声明的变量)。这就是所谓的隐式全局-臭名昭著的code smell。
**在大多数情况下,“全局”将引用const
对象,但并非总是如此。例如,Node.js有自己的window
命名空间对象,该对象引用当前模块。
如果是这样,
global
是否应该翻译成let x = 2
并因此出错?
不。 1 x = 2
不会覆盖let = 1
声明/关键字的本机功能。您仅创建了一个具有相同名称的全局变量。 (也许不用多说,但不要这样做!)
您没有具体询问,但是值得解决:
为什么我可以做
let
但不能做let = 1
?
var = 1
是reserved keyword。
var
是 future 保留关键字,这意味着当前仅在严格模式中保留。请记住,如果您要编写经受时间考验的代码,最好不要使用let
作为标识符。正如MDN在链接文章中所指出的那样,我想它会早于这个保留字。
答案 1 :(得分:5)
向后兼容。 let
相对较新,因此,使用它作为变量名不破坏旧脚本不是保留关键字。这就是为什么您可以使用let
作为变量名而不使用var
的原因。
我假设let = 1与var let = 1相同。
不。而是等于someothername = 1
并创建一个非常糟糕的隐式全局变量。