1. /* 1、使用箭头函数,可以解决this关键字指向问题 */
  2. var id = 1001
  3. var btn = document.getElementById("btn")
  4. btn.onclick = function(){
  5. // console.log(this.id);//btn
  6. setTimeout(()=>{ //如果这里使用的是箭头函数,那么它自身是没有this指向的,就会向外去 找,就找到btn这个事件函数的this
  7. console.log(this.id);//1001
  8. },1000)
  9. }
  1. var id = 1001
  2. var btn = document.getElementById("btn")
  3. var show = ()=>{
  4. console.log(this.id);//1001
  5. }
  6. btn.onclick = function(){
  7. /* 在函数内部调用一个普通函数,this指向window */
  8. go()//1001
  9. show()//1001
  10. }
  11. function go(){
  12. console.log(this.id);
  13. }

bind

  1. 1onclick
  2. 2、在对象的方法中,谁调用方法,this就指向谁
  3. 3、函数直接调用的时候,this指向window
  4. var name = 'window'
  5. var obj = {
  6. name:'obj',
  7. sayName:function(){
  8. console.log(this.name);
  9. }
  10. }
  11. var show = function(){
  12. console.log(this.name);
  13. }.bind(obj)
  14. show()//obj
  15. 使用bind方法,可以改变函数运行的上下文环境,bind中的参数传入谁,this就指向谁

call、aplly

  1. bind,call,aplly的区别
  2. 1callapply是调用的时候执行
  3. 2bind仅仅只改变了函数上下文的运行环境,不会马上执行
  4. var name = 'window'
  5. var obj = {
  6. name:'obj',
  7. sayName:function(){
  8. console.log(this.name);
  9. }
  10. }
  11. function go(){
  12. console.log(this.name);
  13. }
  14. go()
  15. // call与apply也可以改变函数内部this关键字的指向
  16. go.call(obj)//obj
  17. go.apply(obj)//obj
  1. callaplly的区别
  2. var name = 'window'
  3. var obj = {
  4. name:'obj'
  5. }
  6. /* 函数存在多个参数的情况,call按顺序传参,apply必须传数组 */
  7. function go(a,b){
  8. console.log(this.name);
  9. console.log(a+b);
  10. }
  11. // go(2,3)
  12. // go.call(obj,2,3)
  13. go.apply(obj,[2,3])

Snipaste_2021-11-04_09-13-03.jpg