function a1(){
console.log(this)
}
function a2(){
'use strict';
console.log(this)
}
a1() //window
a2() //undefined
这种情况下比较简单直接,函数在浏览器全局环境直接被调用,非严格模式下this指向window,严格模式下use strict情况下指向undefined。
const foo ={
a:10,
fn:function(){
console.log(this) //window
console.log(this.a) //undefined
}
}
let fn1=foo.fn;
fn1()
当函数fn作为foo对象的一个方法时,我们将fn赋值给了fn1之后,fn1仍然是在window的全局环境中执行的。所以会输出window和undefined。输出window是因为非严格模式this指向window,输出undefined是因为在fn1中没有a。如果直接输出foo.fn,结果就会不一样了。因为在foo.fn中,this指向的是foo对象。
综上所述在执行函数时我们不需要考虑显式绑定,如果函数中的this是被上一级的对象所调用的,那么this执行的就是上一级的对象;否则指向全局环境。