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

姬神ブラック 10 years ago

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

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

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

bj7610 answered 10 years 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 10 years ago

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


 for (variable in object) {
  ...
}

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

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

MDN for...in 参考

魔理沙的弟弟 answered 10 years 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 10 years ago

Your Answer