JavaScriptlet和var区别

ES5只有函数作用域和全局作用域,var属于ES5。let属于ES6,新增块级作用域。目的是可以写更安全的代码。
The let statement declares a block scope local variable, optionally initializing it to a value. – MDN

区别

  1. let声明的变量绑定到最近的块级作用域(用{}括起来的)。var绑定到最近的函数作用域或者全局作用域(例如浏览器是window,node是global)。 – ***
  2. let和var都存在变量提升(hoisting)。但let在声明之前不能访问这个变量(暂时性死区) – 参考1 参考2 参考3

例子1,for loop中的var

for (var i = 0; i < 10; i++) {  
  setTimeout(function() {  // 同步注册回调函数到异步的任务队列。
    console.log(i);        // 执行这里时,同步代码for循环已经执行完成。
  }, 0);
}

//输出10个10

第一点,var声明的变量绑定到全局作用域,例如浏览器的window对象。第二点,for是同步代码,setTimeout是回调函数(异步编程的一种)。
所以当执行异步队列中的setTimeout里面的console.log执行时,for循环已经完成了,i的值为10,可以用window.i或者global.i查看。

例子2,for loop中的let

for (let i = 0; i < 10; i++) {  
  setTimeout(function() {  
    console.log(i);        
  }, 0);
}

// 输出0 1 2 3 4 5 6 7 8 9,符合常理

因为let声明的变量把i绑定到for循环的块级作用域。

例子3,let和var都存在变量提升,只是let不能在声明前调用

JavaScriptlet和var区别

拓展延伸 TS;DR: Too short don’t read. ????

for(同步) -> setTimeout(回调->异步) -> i形成了闭包,因为setTimeout的块级作用域没有声明i, 所以i是外部引用。那么i就要在外面找,例子1从全局作用域找,例子2从for循环作用域找。

这个简单,普普通通的例子涉及到了同步、异步、闭包、let、var、作用域等知识点。

原文链接:https://www.cnblogs.com/allen2333/p/11212891.html
本文来源 爱码网,其版权均为 原网址 所有 与本站无关,文章内容系作者个人观点,不代表 本站 对观点赞同或支持。如需转载,请注明文章来源。

© 版权声明

相关文章