当前位置: 首页 > 面试题库 >

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

宇文念
2023-03-14
问题内容

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


 类似资料:
  • 苹果Swift语言中的和有什么区别? 在我的理解中,它是一种编译语言,但它不会在编译时检查类型。这让我很困惑。编译器如何知道类型错误?如果编译器不检查类型,难道不是生产环境的问题吗?

  • 本文向大家介绍说下var、let和const有什么区别?相关面试题,主要包含被问及说下var、let和const有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 var定义变量,let定义常量,const定义变量。 var存在变量提升,let和const不存在变量提升 let,const部分说反了吧...

  • 问题内容: 我在此阅读了bash手册页,但我不了解其中的区别。我对它们进行了测试,它们似乎产生了完全相同的结果。 如果未通过命令行参数设置值,我想设置变量的默认值。 上面的代码回显if 为null并回显if不为null的值。这样: 根据Bash手册页, 使用默认值。如果参数未设置或为null,则替换单词的扩展名。否则,将替换参数的值。 分配默认值。如果参数未设置或为空,则将单词扩展指定给参数。然后

  • 问题内容: 我不知道是什么样的区别,并在 ES6 。两者都是块作用域的,如以下代码中的示例所示: 在ES5中,输出为: 但是在ES6中它将是: 我想知道为什么 ES6 允许更改值,问题是为什么我们现在应该使用’const’?我们可以用“ let”代替吗? 注意 :jsbin可以用于测试,选择 JavaScript 运行 ES5 代码,并选择 Traceur 使用 ES6 功能运行它。 问题答案:

  • 本文向大家介绍Javascript中的var functionName = function(){}和function functionName(){}有什么区别?,包括了Javascript中的var functionName = function(){}和function functionName(){}有什么区别?的使用技巧和注意事项,需要的朋友参考一下 functionDisplayOne

  • Kotlin中的和有什么区别? 如本链接所述: 只读属性声明的完整语法与可变属性声明的不同之处在于两个方面:它以val而不是var开头,并且不允许setter。 但就在前面有一个使用setter的示例。 为什么我们两者都需要? 这不是Kotlin中变量的重复,与Java的区别:“var”vs.“val”?因为我询问的是与文档中的特定示例相关的疑问,而不仅仅是一般性的疑问。