【问题标题】:What is the actual advantage of using let/block scoping?使用 let/block 作用域的实际优势是什么?
【发布时间】:2017-03-16 14:59:13
【问题描述】:

我似乎看不出使用let 的实际优势。当然,如果我有一个 for 循环,我会使用 let i = 0 而不是 var i = 0i 现在属于 for 循环块的范围。但这真的有好处吗?我的意思是我可以使用 var 并使变量具有函数范围访问权限,但只是在不需要的地方不使用它?阻止作用域有什么好处?

我了解 var 和 let 之间的区别,我想对let 的特殊优势有一个更连贯的理解。

【问题讨论】:

标签: ecmascript-6 let


【解决方案1】:

您已经提到了一个优点:循环中的块范围。这避免了 defining functions inside a loop 的问题,我认为这是 JavaScript 新手的最大陷阱之一:

// With var
var elements = document.querySelectorAll('.var');
for (var i = 0; i < elements.length; i++) {
  elements[i].onclick = function() {
    console.log("I'm element #" + (i + 1) + ".");
  };
}

// With let
elements = document.querySelectorAll('.let');
for (let i = 0; i < elements.length; i++) {
  elements[i].onclick = function() {
    console.log("I'm element #" + (i + 1) + ".");
  };
}
<h3>With <code>var</code></h3>
<div class="var">Click me!</div>
<div class="var">Click me!</div>

<h3>With <code>let</code></h3>
<div class="let">Click me!</div>
<div class="let">Click me!</div>

另一个优点是let 变量默认不会被初始化。这使得在尝试访问更高范围内的同名变量时更容易发现错误:

// With `var`, we get `undefined` which can be tricky to debug in more
// complex code.
var foo = 42;

function bar() {
  console.log(foo); // undefined
  var foo = 21;
}
bar();

// With `let`, we get a ReferenceError, which makes it clear that we made
// a mistake here.
var foo = 42;

function bar() {
  console.log(foo); // ReferenceError
  let foo = 21;
}
bar();

总而言之,这使 JavaScript 更符合其他语言的工作方式。

【讨论】:

  • 只是为了确保我得到这个。因此,在第一个示例中,一旦调用 bar(),foo 就不是 42,因为它已在函数内部再次用 var 声明,所以它变得未定义,对吧?
  • 谢谢,将阅读更多关于在循环内定义函数的优点。那么说用 let 声明的变量没有被提升是否正确?
  • (我添加了一个关于函数的例子......)围绕这个已经有相当多的讨论,因为不同的人将不同的含义与“提升”联系起来。但答案是肯定的:提升意味着变量被声明初始化为默认值(undefined)。 let 声明已声明,但默认情况下未初始化。不过,它们仍在使用相同名称的外部变量。
  • 哇,非常感谢您提供的代码 sn-p。现在完全了解块范围的应用。
猜你喜欢
  • 2011-07-15
  • 2010-10-10
  • 1970-01-01
  • 2019-03-20
  • 2019-06-07
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多