“ES6规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在ES5是很常见的,现在有了这种规定,避免此类错误就很容易了。”
能够举例说明在ES5中有哪些常见的错误吗
“ES6规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在ES5是很常见的,现在有了这种规定,避免此类错误就很容易了。”
能够举例说明在ES5中有哪些常见的错误吗
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 ); => 报错
个人认为变量提升和无块级作用域本身就不规范,应该摒弃掉。
10 回答11.2k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
最简单的,比如说 for(var i = 0; i < 10; i ++){},i在for循环之后还会存在,还能被调用,i的值还会被保存,这个就可能导致bug的出现了