登录

javascript - 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肯定可以的,这个没有问题,大神们,帮我解答一下吧!!!

# JavaScript
高洛峰高洛峰2200 天前493 次浏览

全部回复(4) 我要回复

  • 高洛峰

    高洛峰2017-04-10 15:48:34

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

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

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

    回复
    0
  • PHP中文网

    PHP中文网2017-04-10 15:48:34

    你用 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

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

    回复
    0
  • 迷茫

    迷茫2017-04-10 15:48:34

    你要知道
    第一个是循环因子 由于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还是个变量

    回复
    0
  • PHPzhong

    PHPzhong2017-04-10 15:48:34

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

    for (variable in object) {
      ...
    }
    variable
    每次迭代,一个不同的属性名将会赋予 variable 
    object
    可枚举属性被迭代的对象
    for (const key in object) // 每次 key 都会被赋值

    MDN for...in 参考

    回复
    0
  • 取消回复发送