每个函数在定义被 ECMAScript 解析器解析时,都会创建两个特殊的变量:this
和 arguments
,换句话说,每个函数都有属于自己的 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' { let a = 'aaaa'; console.log(this.a); } let obj1 = { name:'lihua', nicheng:this.name, } console.log(obj1.nicheng); console.log(obj1.name);
function f1(){ console.log(this); this.b = 'bbbbb'; console.log(this.b); } let ff = new f1(); console.log(ff.b); let obj2 = { name:'lihua', nicheng(){ let name = 'xiaoming'; console.log(this); return this.name; } } console.log(obj2.nicheng());
let f2 = () => { console.log(this); } f2(); let obj3 = { name:'lihua', nicheng:() => { console.log(this); return this.name } } console.log(obj3.nicheng());
</script>
|
总结
- 只有
window
和常规函数会被编译器创建 this
对象,块级作用域、对象{}、箭头函数都不会,他们只能去外面寻找。
- 常规函数的
this
在自定义时指向自己或实例,在对象做方法时指向对象;
特性
- 特性一:
this
是静态的,this
始终指向函数申明时外层作用域下的 this
值;而非箭头函数 this
会随着 call
和 apply
而改变;
- 特性二:箭头函数不能作为构造函数,去实例化对象;
- 特性三: 不可以使用
aruguments
变量
- 特性四:箭头函数在符合条件的情况下,还可以简写,更少书写代码;
使用使用:
对于需要使用 object.method()
方式调用的函数,使用普通函数定义,不要使用箭头函数。对象方法中所使用的 this
值有确定的含义,指的就是 object
本身。
其他情况下,全部使用箭头函数。