注册
登录
JS
使用“ let”和“ var”有什么区别?
返回
使用“ let”和“ var”有什么区别?
作者:
狗头军师
发布时间:
2024-01-24 10:33:13 (2月前)
ECMAScript 6引入了该let声明。
我听说它被描述为“局部”变量,但是我仍然不太确定它的行为与var关键字的不同。
有什么区别?什么时候应该let用完var?
收藏
举报
2 条回复
1#
回复此人
v-star*위위
|
2020-08-04 16-41
范围规则 主要区别是作用域规则。用var关键字声明的变量的作用域为立即函数主体(因此作用域为函数),而let变量的作用域为由表示的立即封闭块{ }(因该块作用域)。 ``` function run() { var foo = "Foo"; let bar = "Bar"; console.log(foo, bar); { let baz = "Bazz"; console.log(baz); } console.log(baz); // ReferenceError } run(); ``` 将let关键字引入语言的原因是函数范围令人困惑,并且是JavaScript中错误的主要来源之一。 从另一个stackoverflow问题看这个示例: ``` var funcs = []; // let's create 3 functions for (var i = 0; i < 3; i++) { // and store them in funcs funcs[i] = function() { // each should log its value. console.log("My value: " + i); }; } for (var j = 0; j < 3; j++) { // and now let's run each one to see funcs[j](); } ``` My value: 3funcs[j]();由于匿名函数绑定到同一变量,因此每次调用时都会输出到控制台。 人们必须创建立即调用的函数以从循环中捕获正确的值,但这也很麻烦。 吊装 虽然用var关键字声明的变量被提升(undefined在运行代码之前用初始化),这意味着即使在声明它们之前,也可以在其封闭范围内访问它们: ``` function run() { console.log(foo); // undefined var foo = "Foo"; console.log(foo); // Foo } run(); ``` let变量只有在评估其定义后才会初始化。在初始化之前访问它们会导致ReferenceError。从块开始到初始化处理之前,变量都处于“临时死区”。 ``` function checkHoisting() { console.log(foo); // ReferenceError let foo = "Foo"; console.log(foo); // Foo } checkHoisting(); ``` 创建全局对象属性 在顶层let,与不同var,不会在全局对象上创建属性: ``` var foo = "Foo"; // globally scoped let bar = "Bar"; // globally scoped console.log(window.foo); // Foo console.log(window.bar); // undefined ``` 重新声明 在严格模式下,var将使您在let引发SyntaxError的同时在同一作用域中重新声明相同的变量。 ``` 'use strict'; var foo = "foo1"; var foo = "foo2"; // No problem, 'foo' is replaced. let bar = "bar1"; let bar = "bar2"; // SyntaxError: Identifier 'bar' has already been declared ```
编辑
登录
后才能参与评论