ES6中的let const的作用

“ES6规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在ES5是很常见的,现在有了这种规定,避免此类错误就很容易了。”
能够举例说明在ES5中有哪些常见的错误吗

阅读 3.2k
3 个回答

最简单的,比如说 for(var i = 0; i < 10; i ++){},i在for循环之后还会存在,还能被调用,i的值还会被保存,这个就可能导致bug的出现了

1.变量提升。

使用let你在一个变量声明之前使用是会报错的。但是var就正常。
比如:

    //right
    a = 4;
    var a = 3;
    
    //error
    a = 4;
    let a = 3; 

又比如你变量声明的是一个函数:

    //error
    sub();
    let sub =  function(){
        console.log(111);
    }
    
    //right 
    sub();
    var sub =  function(){
        console.log(111);
    }

2.块作用域和函数作用域。
ES5是函数作用域,也就是说,在ES5中函数的那对大括号{}才看成一个块。而for这类循环不会。但是ES6将所有的{}都看成一个单独的代码运行块:就是说,{}代码块运行的时候会创建自己的运行环境,你可以想象成一个房子,在进去运行的时候,他会将参数带进去,在里面完成自己所有的操作,变量的声明也只对他自己有效。当代码块运行结束了,就返回运行结果(如果有)并销毁自己的房子和房子里的一切。
举个栗子

//ES5
for(var i = 0; i<5;i++){
    var abc = "abc";
}

console.log(abc);//将会打印出 abc

function bbb(){
    var ddd = 123456;
}

console.log(ddd);//将会打印出 undefined

//ES6 
for(let i = 0; i<5;i++){
    let abc = "abc";
}

console.log(abc);//将会打印出 undefined

function bbb(){
    let ddd = 123456;
}

console.log(ddd);//将会打印出 undefined

为什么ES6规定成块作用域呢?

欢迎来到JavaScript的进阶 课后作业! 希望能够帮到你~

1.变量提升:
console.log( a );         => undefined
var a = 0;

上面两行代码等同于

var a;
console.log( a );
a = 0;

2.块级作用域
if( true ) {
    var a = 0;
}
console.log( a );            => 0
es5 没有块级作用域,有函数作用域

3.es6 变量提升
console.log( a );            => 报错
let a = 0;

es6 块级作用域
if( true ) {
    let a = 0;
}
console.log( a );            => 报错

个人认为变量提升和无块级作用域本身就不规范,应该摒弃掉。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题