Arrow Func & set map
箭头函数
箭头函数不会重新绑定this, this指向最外层; 而普通函数会重新绑定this到 是谁调用了该函数,
应用场合:
普通函数会重新绑定this, 箭头函数不会重新绑定this. 根据需求选择……
面试经典: 当前this是什么?
举例子:
1
2
3
4
5
6
7
8
9
10
11
12
13 document.getElementById("the-button")
.addEventListener("click",function(){
console.log(this);//输出的是button
this.classList.add("bigger");//成功添加监听
})
-----------------------------------------------------------
console.log(this) //输出window
document.getElementById("the-button")
.addEventListener("click",()=>{
console.log(this);//输出的是window
this.classList.add("bigger");//添加监听失败
})原因是箭头函数不会重新绑定this, this指向最外层;
而普通函数会重新绑定this到 是谁调用了该函数, 这里该函数作为addEventListener的参数, 其实是被button 调用
更进一步的例子:
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 document.getElementById("the-button")
.addEventListener("click",function(){
console.log(this);//输出的是button
this.classList.add("bigger");//成功添加监听
//希望等待一秒后变化
setTimeout(function(){
console.log(this); //why! 指向window???? 因为这里发生函数调用,则重新绑定,而setTimeout不是被别人调用的,所以是window
this.innerHTML = "clicked";
})
})
--------解决方法 一:保存临时this (很乱)-------------------
document.getElementById("the-button")
.addEventListener("click",function(){
console.log(this);//输出的是button
this.classList.add("bigger");
var tmpthis = this;
setTimeout(function(){
console.log(tmpthis);
tmpthis.innerHTML = "clicked";
})
})
--------最好的方法: 箭头函数替代--------------------------
document.getElementById("the-button")
.addEventListener("click",function(){
console.log(this);//输出的是button
this.classList.add("bigger");
setTimeout(()=>{
console.log(this);
this.innerHTML = "clicked";
})
})==待突破的难点:==
- ==this 的值是什么?==
例题一
1 | /*非严格模式*/ |
例题二
1 | /*非严格模式*/ |
1 | const ages =[14,19,21]; |
set
1 | const numSet = new Set(); |
map
1 | const person = new Map(); |