this的绑定方式:
-
默认绑定(非严格模式下this指向全局对象, 严格模式下
this
会绑定到undefined
) -
隐式绑定,this 永远指向最后调用它的那个对象(如
obj.foo()
的调用方式,foo
内的this
指向obj
) -
显示绑定(apply、call、bind)
-
new绑定
-
箭头函数绑定(
this
的指向由外层作用域决定的)
一些特殊例子:
1. let 或者 const
,变量是不会被绑定到window
上的;var 会let a = 10 ;const b = 20;
function foo () { console.log(this.a);console.log(this.b) }
foo(); console.log(window.a)
答案:undefined undefined undefined
2.把一个函数当成参数传递到另一个函数的时候,也会发生隐式丢失的问题,与包裹着它的函数的this指向无关。在非严格模式下,this绑定到window上,严格模式undefined
var a = 2
function foo () { console.log(this.a) }
function doFoo (fn) {
// obj2.doFoo 调用该函数,this指向obj2,但是之后调用fn(就是foo)函数,this 指向的是 window
console.log(this)
fn()
}
var obj = { a: 1, foo }
var obj2 = { a: 3, doFoo }
obj2.doFoo(obj.foo) // 结果:{ a:3, doFoo: f } 和 2
3.匿名函数,它里面的
this
在非严格模式下始终指向的都是window
var a = 3
var obj2 = {
a: 2,
foo1: function () {console.log(this.a)},
foo2: function () {
setTimeout(function () {
console.log(this) console.log(this.a)
}, 0)
}
}
obj2.foo1(); obj2.foo2() // 结果:2 window 3