改动代码,考察ES6的知识点

题目:
以最小的改动解决一下代码的错误(可以使用es6);

			var  obj={
				name:'jsCoder',
				skill:['es6','react','angular'],
				say:function(){
					for(var  i=0,len=this.skill.length;i<len;i++){

						setTimeout(function(){
							//console.log(this);
							console.log('No.'+i+this.name);
							console.log(this.skill[i]);
							console.log('---------------');
						},0);
						console.log(i);

					}
				}
			};

			obj.say();

错误执行

0
1
2
NO.3
报错
NO.3
报错
NO.3
报错

期望得到以下结果

1
2
3
No.1 jsCoder
es6
---------------------
No.2 jsCoder
react
---------------------
No.3 jsCoder
angular
---------------------

改动后的代码

	var  obj={
			name:'jsCoder',
			skill:['es6','react','angular'],
			say:function(){
				for(let  i=0,len=this.skill.length;i<len;i++){

					setTimeout(()=>{
						console.log('No.'+(i+1)+this.name);
						console.log(this.skill[i]);
						console.log('---------------');
					},0);
					console.log(i+1);
				}
			}
		};

		obj.say();

说明:考察箭头函数和let块状域

1、《JavaScript高级程序设计》第二版中,写到:“超时调用的代码都是在全局作用域中执行的,因此函数中this的值在非严格模式下指向window对象,在严格模式下是undefined”。也就是说在非严格模式下,setTimeout中所执行函数中的this,永远指向window!!

2、 *let是更完美的var,不是全局变量,具有块级函数作用域,大多数情况不会发生变量提升。const定义常量值,不能够重新赋值,如果值是一个对象,可以改变对象里边的属性值。

1、let声明的变量具有块级作用域
2、let声明的变量不能通过window.变量名进行访问
3、形如for(let x…)的循环是每次迭代都为x创建新的绑定

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值