JavaScript 使用“ let”和“ var”有什么区别?

ECMAScript 6引入了该let声明

我听说它被描述为“局部”变量,但是我仍然不太确定它的行为与var关键字的不同。

有什么区别?什么时候应该let用完var

回答:

范围规则

主要区别是作用域规则。用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: 3``funcs[j]();由于匿名函数绑定到同一变量,因此每次调用时都会输出到控制台。

人们必须创建立即调用的函数以从循环中捕获正确的值,但这也很麻烦。

Hoisting

尽管用var关键字声明的变量被“提升”到块的顶部,这意味着即使在声明它们之前,也可以在其封闭范围内访问它们:

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

以上是 JavaScript 使用“ let”和“ var”有什么区别? 的全部内容, 来源链接: utcz.com/qa/408523.html

回到顶部