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

如何解决使用“let”和“var”有什么区别??

开发过程中遇到使用“let”和“var”有什么区别?的问题如何解决?下面主要结合日常开发的经验,给出你关于使用“let”和“var”有什么区别?的解决方法建议,希望对你解决使用“let”和“var”有什么区别?有所启发或帮助;

问题描述

主要区别在于范围规则。由var关键字声明的变量的作用域是直接函数体(因此是函数作用域),而let变量的作用域是由表示的直接封闭{ }(因此是块作用域)。

function run() {
  var foo = "Foo";
  let bar = "Bar";

  console.log(foo, bar); // Foo Bar

  {
    var moo = "Mooo"
    let baz = "Bazz";
    console.log(moo, baz); // Mooo Bazz
  }

  console.log(moo); // Mooo
  console.log(baz); // ReferenceError
}

run();

let关键字引入语言的原因是函数范围令人困惑,并且是 JavaScript 中错误的主要来源之一。

查看此示例:

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关键字声明的变量被hoistedundefined代码运行之前用初始化),这意味着它们甚至在声明之前就可以在其封闭范围内访问:

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"; // not allowed to be globally scoped

console.log(window.foo); // Foo
console.log(window.bar); // undefined

Redeclaration

在严格模式下,var将让您在同一范围内重新声明相同的变量,同时let引发 SyntaxError。

'use strict';
var foo = "foo1";
var foo = "foo2"; // No problem, 'foo1' is replaced with 'foo2'.

let bar = "bar1"; 
let bar = "bar2"; // SyntaxError: Identifier 'bar' has already been declared

解决方法

ECMAScript 6 引入let语句

我听说它被描述为一个local变量,但我仍然不太确定它的行为与var关键字有何不同。

有什么区别?。什么时候应该letvar?

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

猜你在找的编程问答相关文章

怎样才能让 Git“忘记”一个被跟踪但现在在 .gitignore 中的文件?
Python 中的metaclasses是什么?
如何在 Linux 上查找包含特定文本的所有文件?
如何从异步调用返回响应
如何在一个表达式中合并两个字典(取字典的并集)?
HTTP 中的 POST 和 PUT 有什么区别?
使用 Git 将最近的提交移动到新分支
在 JavaScript 比较中应该使用哪个等于运算符 (== vs ===)?
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜 "程序精选"关注