前置知识

  1. 在箭头函数当中,this的指向为函数声明时所在作用域下this的值

代码

next为普通函数

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
var resultGet = {
"code": "1",
"day": "02/ 27",
"result": [{
"date": "272年02月27日",
"title": "罗马帝国皇帝君士坦丁大帝出生"
},
{
"date": "684年02月27日",
"title": "唐中宗李显被母亲武则天废为庐陵王,驱离京师"
},
]
};
resultGet[Symbol.iterator] = function () {
var i = 0;
console.log('外面的', this);//普通函数--指向的是要处理的数据,在这里也就是resultGet
return {
//这里改为箭头函数,其他的不变
'next': function() {
if (i < 1) {
i++;
console.log('里面的', this);//普通--指向的指向的是刚刚return创建的指针对象
return {
'value': '测试',
'done': false
};
} else {
return {
'value': '测试',
'done': true
};
}
}
}
}
//调用迭代器,测试里面的console.log()
for (let v of resultGet) {

}

运行结果

next为普通函数运行结果截图

next为箭头函数

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
var resultGet = {
"code": "1",
"day": "02/ 27",
"result": [{
"date": "272年02月27日",
"title": "罗马帝国皇帝君士坦丁大帝出生"
},
{
"date": "684年02月27日",
"title": "唐中宗李显被母亲武则天废为庐陵王,驱离京师"
},
]
};
resultGet[Symbol.iterator] = function () {
var i = 0;
console.log('外面的', this);//普通函数--指向的是要处理的数据,在这里也就是resultGet
return {
//这里改为箭头函数,其他的不变
'next': ()=> {
if (i < 1) {
i++;
console.log('里面的', this);//箭头函数--指向的依旧是要处理的数据,在这里也就是resultGet
return {
'value': '测试',
'done': false
};
} else {
return {
'value': '测试',
'done': true
};
}
}
}
}
//调用迭代器,测试里面的console.log()
for (let v of resultGet) {

运行结果

next为箭头函数运行结果截图

为什么?

个人理解,可能有误

证明个人理解

实例1代码及运行结果

1
2
3
4
5
6
7
8
9
10
11
12
let p = {
a: function () {
var obj = {
i: 10,
b: () => {
console.log(this.i, this);
},
}
obj.b();
}
}
p.a(); //undefined {a: ƒ}

实例2代码及运行结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var objSelf = {
i: 10,

b: () => {
console.log(this.i, this)
},

c: function () {
console.log(this.i, this)
}

}

objSelf.b(); // undefined window{...}

objSelf.c(); // 10 {i: 10, b: ƒ, c: ƒ}