this的指向在函数定义的时候是肯定不了的,只有函数执行的时候才能肯定this到底指向谁,实际上css
this的最终指向的是那个调用它的对象(这里其实并不彻底对,this的指向有时候会很微妙,得靠本身去慢慢体会)数组
只有方法在对象上,对象调用当前方法,指向当前对象app
function fnThis(){ let user='js'; console.log(this.user)//undefined console.log(this)//global(window) } fnThis(); 这里为何会输出一个全局的对象?由于咱们申明的函数,在全局里,如今执行这个函数 其实是全局在调用 let obj={ user:'js', fn:function(){ console.log(this.user) } obj.fn(); 这里是obj在调用,因此指向咱们的obj,这并不能说明,咱们一开始就说的this最终调用他的那个 对象 let obj={ user:'js', objTwo:{ user:'css', fn:function(){ console.log(this.user) } } } obj.objTwo.fn(); 这里只是指向了obj2,而并无指向最终调用它的obj.
来个料咋们看看this这家伙函数
实际上是这个点击事件的匿名函数在调用,而这fn()自己是全局上下文的函数,它的this指向的是全局,它是做为这个匿名函数的普通函数,天然指向的全局this
咱们若是这样写spa
let obj={ user:'js', objTwo:{ user:'css', fn:function(){ console.log(this.user) console.log(this) } } } let objThre=obj.objTwo.fn; objThree(); 把函数赋值给了objThree,而objThree是在全局上,因此输出的是全局
let chinesePeople=function(){ this.name='张飞'; return obj } 若是返回的是对象,this就指向返回的那个对象,不然就指向实例对象
let obj={a:80} let objTwo={ a:70, fn:function(){ console.log(this.a); } } objTwo.fn.call(obj); 调用一个方法,并改变其this指向 objTwo.fn.apply(obj); 调用一个方法,并改变其this指向 前2者区别,在于后面的参数,一个是顺序,一个是数组 objTwo.fn.bind(obj)(); bind()方法会建立一个新函数,在绑定后,咱们能够加括号当即执行,也能够等须要执行再执行 第一个参数对象,之后的顺序传参 new方法,实际上是隐藏的调用了一个call的方法