0%

JavaScript杂谈(一)——箭头函数没有this

每个函数在定义被 ECMAScript 解析器解析时,都会创建两个特殊的变量:thisarguments,换句话说,每个函数都有属于自己的 this 对象;

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<script>
window.a = 'windous'
window.b = 'bbbbwindous'
window.name = 'lisi'
//1.块级作用域下不会被创建this;this只有全局对象window和常规函数才会创建
{
let a = 'aaaa';
console.log(this.a);
}
//2对象下也不会被创建this;都只能去外层寻找
let obj1 = {
name:'lihua',
nicheng:this.name,
}
console.log(obj1.nicheng); //打印的windou的namelisi,所以对象也没有this
console.log(obj1.name);

//3.自定义常规函数的this,ECMAScript解析器会帮助我们自动创建并指向函数本身
function f1(){
console.log(this);//ECMAScript解析器会帮助我们自动创建,打印是fi(){}
this.b = 'bbbbb'; //我们可以调用它,做一些赋值
console.log(this.b);//结果是‘bbb’
}
let ff = new f1();//当我们初始化实例的时候,this就会指向实例ff
console.log(ff.b);//因此我们可以通过实例名.属性名的方式调用this.b,打印是‘bbb’
//4.常规函数作为对象的方法时,ECMAScript解析器会帮助我们自动创建,并指向对象
let obj2 = {
name:'lihua',
nicheng(){
let name = 'xiaoming';
console.log(this);//指向的是obj2
return this.name;
}
}
console.log(obj2.nicheng());//打印lihua

//5.自定义箭头函数时,我们知道箭头函数和无论如何都不会被ECMAScript解析器创建this,
//所以虽然也可以用this但是都是调用外层的this,所以这里直接调用window
let f2 = () => {
console.log(this); //打印window
}
f2();
//6.箭头函数作为对象方法时,仍然需要调用外层的this,
//对象也没有this,所以只能调用对象外面的this,那还是this
//注意和常规函数做方法时区别,常规函数是由this,并被编译器指向了对象,而箭头函数是直接就没有this,只能去外面找;
let obj3 = {
name:'lihua',
nicheng:() => {
console.log(this);//打印window
return this.name
}
}
console.log(obj3.nicheng());//打印lisi

</script>

总结

  1. 只有 window 和常规函数会被编译器创建 this 对象,块级作用域、对象{}、箭头函数都不会,他们只能去外面寻找。
  2. 常规函数的 this 在自定义时指向自己或实例,在对象做方法时指向对象;

特性

  • 特性一:this 是静态的,this 始终指向函数申明时外层作用域下的 this 值;而非箭头函数 this 会随着 callapply 而改变;
  • 特性二:箭头函数不能作为构造函数,去实例化对象;
  • 特性三: 不可以使用 aruguments 变量
  • 特性四:箭头函数在符合条件的情况下,还可以简写,更少书写代码;

使用使用:

  1. 对于需要使用 object.method() 方式调用的函数,使用普通函数定义,不要使用箭头函数。对象方法中所使用的 this 值有确定的含义,指的就是 object 本身。

  2. 其他情况下,全部使用箭头函数。

-------------本文结束感谢您的阅读-------------