var 和 let 的区别?

2016-11-15 23:19:31 +08:00
 brooky
var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 10   
var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6

想不明白了, 谁能帮忙解释下这是为啥呢?

5190 次点击
所在节点    JavaScript
31 条回复
JohnLou
2016-11-15 23:29:29 +08:00
我刚看了这个,因为 var 的作用域只能是函数和全局,而 let 是块,也就是{},所以对于 let , for 循环一次, i 就在那个循环里起作用而已。
chemzqm
2016-11-15 23:32:43 +08:00
你或许需要一本 exploring es6
miketeam
2016-11-15 23:38:03 +08:00
总是喜欢把事情搞得这么复杂,所以一点都不喜欢了 js
nanxiaobei
2016-11-15 23:58:22 +08:00
用 var ,每个 function 都保存着 i 的同一个变量对象,为 10 。
用 let ,是块级作用域,每次的 i 是独立的,大概是这样吧。
brooky
2016-11-16 00:02:21 +08:00
@JohnLou 用 var 声明的话数组里面存的是 [ funciton(){console.log(i)}, funciton(){console.log(i)}...]
用 let 声明数组里面的即是[ function(){console.log("1")}, function(){console.log("2")} ....]?
jswh
2016-11-16 00:09:00 +08:00
brooky
2016-11-16 00:18:21 +08:00
@jswh 我就是看到这个没有看明白的...
JohnLou
2016-11-16 00:30:14 +08:00
@brooky 不是很准确,可以理解为这样[{let i=0;}, {let i =1}], i ++之后就新起一个块。
SoloCompany
2016-11-16 01:08:54 +08:00
你应该这样理解
本来不应该有 var 和 let 的
因为他们其实除了作用域以外没有任何区别
但由于历史原因, var 的作用域泄露的问题被吐槽太多了,又不得不兼容,所以才产生了 let

js 三种变量声明方式

x;
var x;
let x;

如果可以用更合适的关键字修饰符的话,就是等同于
global x; (前提是变量没有在任何作用域中被定义)
function local x;
local x;
ByZHkc3
2016-11-16 01:17:10 +08:00
作用域的区别, let 只在当前循环或函数里有效,这等同于再函数里 var 了一样。
brooky
2016-11-16 01:45:56 +08:00
````
var tmp = new Date();

function f() {
console.log(tmp);
if (false) {
var tmp = "hello world";
}
}

f(); // undefined
````
又来个问题, 自学真的很不行是不是, 求老司机带带 付费指导
baconrad
2016-11-16 01:56:29 +08:00
因為 var 的變量聲明會被提前,
先這樣處理後, 再來看問題就會比較容易理解.


```
var a = [];
var i;
for ( i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
```


```
var tmp = new Date();

function f() {
var tmp;
console.log(tmp);
if (false) {
tmp = "hello world";
}
}

f(); // undefined

```
geekaven
2016-11-16 02:27:52 +08:00
作用域,变量提升。
geekaven
2016-11-16 02:28:34 +08:00
可以看看《你不知道的 javascript 》 第一卷 1 , 2 , 3 , 4 章
Sivan
2016-11-16 02:32:41 +08:00
建议楼主先学一下基础知识再去学 ES6 相关改进。
yyfearth
2016-11-16 06:58:34 +08:00
@miketeam 其实不是复杂 是由于大量的历史包袱 JS 一开始设计的不好 然后修修改改 导致这样的问题
yyfearth
2016-11-16 07:00:50 +08:00
@brooky 所以两者不要混用
let 是 block scope 和大多数语言一样 所以最近才出现 减少问题的发生
var 是 function scope 由于历史原因 对于很多人来说 非常容易混淆

所以你能用 let 的情况下 只用 let
如果你要考虑浏览器兼容性的情况下 就只用 var
不要混用 把自己搞糊涂
kitalphaj
2016-11-16 07:27:00 +08:00
难道不是还有一个 const 么。。。。所以一共是四种修饰方式么? var, let, const, 和空。。。
WildCat
2016-11-16 07:44:14 +08:00
murmur
2016-11-16 08:05:13 +08:00
目前 var 和 let 没任何区别 本来我以为 babel 会把 let 的变量都搞到函数里隔绝作用域 结果如果没重名的话就是把 var 改成 let
如果有重名就在 let 的变量下家个下划线。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/320790

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX