一、从头探究为什么js中的this总是东指西指;apply/call/bind区别
一、从头探究为什么js中的this总是东指西指
来源:https://www.bilibili.com/video/BV13C4y187Ws?spm_id_from=333.999.0.0
this指向问题:
- 对于函数来说永远是谁调用了它,函数中的this就指向谁。
无论这个函数是全局函数,还是对象的方法。
不能认为全局函数是window的属性;
寻找this指向的根本方法,是看函数是谁调用的,不是看谁声明的。
非严格模式下:
- 自调用函数中this指向window;
- 普通函数调用的this也指向window;
- 对象调用方法时,this指向对象。
构造函数的原型对象中的this指向构造函数的实例化对象,是因为原型中的方法本来就是设置给自己的实例化对象使用的;如果是通用方法且立即执行话就会call。
是实例化对象调用了原型方法,于是原型方法中this指向了实例化对象
- 其他情况
- 事件处理函数中this指向被绑定的元素本身。
- this指向的改变:bind/call/apply第一个参数写哪个对象,this就指向谁。
- 普通函数独立执行,严格模式下,this值为undefined;非严格模式下this值为window。
- 箭头函数中的this一般与父级函数环境保持一致,父级作用域中的this指向谁,箭头函数中的this就指向谁。
二、apply/call/bind区别
bind/call/apply的简单区别:
- call/apply都会改变this指向,call传参是call(this,a,b,c),apply传参是apply(this,[a,b,c])且函数立即执行;
- bind 会创建一个新的函数,且更改新函数中的this指向,并不会立即执行,bind传参是bind(this,a,b,c)。