es6学习let,const遇到问题


const 定义常量,一旦定义就不能更改了。所以下面的函数执行回报错:


 var funcs = [];
for (const i=0; i < 10; i++) {
    funcs.push(function() {
        console.log(i);
    });
}

没有问题,确实报错了。因为它试图改变了const定义的常量值。

但是在for-in 和 for-of 循环中可以用,这个例子中也说可以用????


 var funcs = [],
    object = {
        a: true,
        b: true,
        c: true
    };

for (const key in object) {
    funcs.push(function() {
        console.log(key);
    });
}

funcs.forEach(function(func) {
    func();     // outputs "a", then "b", then "c"
});

这个函数应该可以执行,并没有改变const定义的常量值。我们是改变的循环体中的函数绑定罢了,并没有改变const数值,但是实际执行的时候,报错了。(在node环境下执行的node 12)
看有关的资料也可以执行的。。。
换成let肯定可以的,这个没有问题,大神们,帮我解答一下吧!!!

图片描述

let es6 JavaScript

姬神ブラック 9 years, 10 months ago

代码没有问题,在 babel online repl 运行正常。

是宿主环境的问题,Node.js 的宿主环境(甚至 io.js 的宿主环境)还没有完全实现对 const 的兼容,具体可见 es6 compatible table

如果非要在 node 下使用,可以先用 babel transpile

bj7610 answered 9 years, 10 months ago

你用 io.js 试试就可以

这个是因为 io.js 和 node.js 用的 v8 版本不一样


 > iojs -p process.versions.v8
4.4.63.30

> node -p process.versions.v8
3.28.71.19

不过即使在 iojs 中,加不加 "use strict" ,效果也是不一样的。

只是我不明白,会有什么样的情况需要在这里使用 const

我是实用主义者,所以一切不实用的语法我都当它不存在。

metal answered 9 years, 10 months ago

你的提问有点混乱的感觉,下次应该描述更清晰一些。。
for..in 语法:


 for (variable in object) {
  ...
}

 
  variable
每次迭代,一个不同的属性名将会赋予 variable 
object
可枚举属性被迭代的对象
 

 for (const key in object) // 每次 key 都会被赋值

MDN for...in 参考

魔理沙的弟弟 answered 9 years, 10 months ago

你要知道
第一个是循环因子 由于i++ 所以i每次都变 这里i必须是个变量

然后的遍历


 var a = ['hello', 'world'];
for(var i in a){
}

// 这里也不能是const 因为这个值是遍历数组每个key 
//第一次是hello 第二次是world
//所以也是变量 不能用const

再看let,可以在{}, if, for里声明。用法同var,但作用域限定在块级,let声明的变量不存在变量提升。
所以let a = '123' a还是个变量

newday answered 9 years, 10 months ago

Your Answer