javascript - es6学习let,const遇到问题
高洛峰
高洛峰 2017-04-10 15:46:34
0
4
708

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(4)
小葫芦

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

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

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

Ty80

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

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

迷茫

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

PHPzhong

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

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

MDN for...in 参考

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板