js函数中的this指向及call apply bind对于this的改变
如何理解This指向
this :谁调用它 他就指向谁。(this 永远指向最后调用它的那个对象)
1.在浏览器:如果this是在函数外部则this指向window
2.在node环境:如果this在函数外部则指向{}
如果有new绑定 则指向这个new的实例对象
函数是否通过 call,apply 调用,或者使用了 bind 绑定,如果是,那么this绑定的就是指定的对象【归结为显式绑定】。
这里同样需要注意一种特殊情况,如果 call,apply 或者 bind 传入的第一个参数值是
undefined或者null,严格模式下 this 的值为传入的值 null /undefined。非严格模式下,实际应用的默认绑定规则,this 指向全局对象(node环境为global,浏览器环境为window)
隐式绑定,函数的调用是在某个对象上触发的,即调用位置上存在上下文对象。典型的隐式调用为: xxx.fn()
箭头函数的情况:箭头函数没有自己的this,继承外层上下文绑定的this。
看看具体例子
1 | var name = "windowsName"; |
说明:这里有通过window调用a ,最后调用的是谁的呢?? 其实是a最后调用了this=》》a里面没有那么这个属性,即使外面的window有name也不会调用==》》就像我们对于变量的调用一样,,函数内部的变量不可以使用其他的函数内部的变量,a和window是两个函数 即使window包括a但是调用的时候是使用this 指向了a 也就是标明 我一定要使用a里面的属性
再看看这个坑
1 | var name = "windowsName"; |
为什么和之前的调用差不多 this却是指向window 由上往下看,var f 的时候根本没有调用a.fn;
最后fn() 是使用了window调用的 所以指向了外面的name
this 的指向并不是在创建的时候就可以确定的 永远指向最后调用的它
call和apply以及bind都与this有关 因为他们改变了this的指向
this指向改变的几种方法
1.当你new一个对象时 this就指向创建的实例
1 | let date = new Date() |
1 | new 的实现原理: |
2.使用闭包解决,有两层函数可以再第一层使用_this= this改变指向
1 | //在这里使用的是闭包的原理 也可以改变this的指向 |
3.es6的箭头函数 指向外部的this,()=>{}
箭头函数的 this 始终指向函数定义时的 this,而非执行时。
call apply bind
call
1 | let Object = { |
apply
1 | let Object = { |
bind
1 | let Object = { |
apply 和 call 的区别
他们之间的区别只是传入参数的区别
appll(this,[a,b,c])
call(this,a,b,c)
bind与apply和call有着大的区别
bind会生成新的函数,需要调用再次调用
setTimeout会自动调用