普通函数的this指向是调用的时候决定的,指向函数的调用者.没有调用者,默认指向window.
箭头函数的this指向是定义的时候决定的,指向定义箭头函数时的对象.
(1) 例子:
一、普通函数
function foo() {
console.log(this.a)
}
var a = 1
foo()
const obj = {
a: 2,
foo: foo
}
obj.foo()
const c = new foo()
对于直接调⽤ foo 来说,不管 foo 函数被放在了什么地⽅, this ⼀定是 window.
对于 obj.foo() 来说,我们只需要记住,谁调⽤了函数,谁就是 this ,所以在这个场景下 foo 函数中的 this 就是 obj 对象.
对于 new 的⽅式来说, this 被永远绑定在了 c 上⾯,不会被任何⽅式改变 this.
二、箭头函数
function a() {
return () => {
return () => {
console.log(this)
}
}
}
console.log(a()()())
⾸先箭头函数其实是没有 this 的,箭头函数中的 this 只取决包裹箭头函数的第⼀个普通函数的 this 。在这个例⼦中,因为包裹箭头函数的第⼀个普通函数是 a ,所以此时的 this 是 window 。另外对箭头函数使⽤ bind 这类函数是⽆效的。
(2) this指向的优先级
⾸先, new 的⽅式优先级最⾼,接下来是 bind 这些函数,然后是obj.foo() 这种调⽤⽅式,最后是 foo 这种调⽤⽅式,同时,箭头函数的this ⼀旦被绑定,就不会再被任何⽅式所改变。
(3)思考
var m = {
a: 1,
b: 2,
c: ()=>{
return this.a + this.b
}
// function() {
// return this.a + this.b
// }
}
var N = m.c
console.log(N())
c为普通函数时打印的是什么,c为箭头函数时打印的又是什么呢?
网友评论