this
涉及面试题:如何正确判断 this?箭头函数的 this 是什么?
this
总是指向它的调用者, 使用new
会把 this
绑定到new出来的对象上,不会被改变(除了 apply
/call
/bind
这几特殊的)
function foo() {
console.log(this.a)
}
var a = 1
foo() // foo的调用者是 window ,相当于 window.foo() a = 1
const obj = {
a: 2,
foo: foo
}
obj.foo() // 这里foo() 的调用者是 obj, foo里面的this指向 obj,this.a = obj.a = 2
const c = new foo()
// 使用了new ,this 被绑定在了 c 上面,不会被任何方式改变 this,c 中并没有 a ,所以是 undefined
箭头函数中的 this
箭头函数是没有this
的 ,箭头函数中的 this
是取包裹着箭头函数的作用域中的 this
function a() {
return () => {
return () => {
console.log(this)
}
}
}
console.log(a()()()) // window
对于bind
, apply
, call
可以改变 this
的指向
bind
这些改变上下文的 API ,对于这些函数来说,this
取决于第一个参数,如果第一个参数为空,那么就是 window
如果对一个函数进行多次 bind,那么上下文会是什么呢?
let a = {}
let fn = function () { console.log(this) }
fn.bind().bind(a)() // => window
// fn.bind().bind(a) 等于
let fn2 = function fn1() {
return function() {
return fn.apply()
}.apply(a)
}
fn2()
可以从上述代码中发现,不管我们给函数 bind 几次,fn 中的 this 永远由第一次 bind 决定,所以结果永远是 window
规则间的优先级:
new
的方式优先级最高bind
、apply
、call
obj.foo()