1.函数正常调用的时候this指向window

  1. var name="张三"
  2. function show(){
  3. console.log(this.name);
  4. }
  5. /* 函数正常调用的时候this指向window */
  6. function go(){
  7. var name="李四";
  8. show();
  9. }
  10. go();//window.go()//张三
  11. 函数要有对象去调用,事件也是需要对象去执行的

2.改变this的指向的方法

A.call和apply(应用场景:传递多个参数的情况)
两者的区别:call:依次传递
apply:数组传递

  1. var name="window"
  2. var zhang ={
  3. name:"张三",
  4. }
  5. function show(a,b){
  6. console.log(this.name);
  7. console.log(a+b);
  8. }
  9. show(1,2);//window 3
  10. show.call(zhang,2,3);//张三 5
  11. show.apply(zhang,[3,4]);//张三 7

B.bind
bind 和call与apply的区别: bind绑定的函数不会马上执行,只是改变了函数上下文的执行环境, call,apply调用的时候马上执行

  1. var name = "window"
  2. var zhang = {
  3. name: "张三",
  4. }
  5. var show = function (a, b) {
  6. console.log(this.name);
  7. console.log(a + b);
  8. }.bind(zhang);
  9. show(2,3);//张三 5

3.bind的应用场景

定时器

  1. <button id="btn">按钮</button>
  2. <script>
  3. var id="1001"
  4. var btn=document.getElementById("btn");
  5. //第一种
  6. btn.onclick=function(){
  7. // console.log(this.id);//btn
  8. setTimeout(function(){
  9. console.log(this.id);
  10. }.bind(btn),1000)//btn
  11. }
  12. //第二种
  13. btn.onclick=function(){
  14. var self=this;
  15. setTimeout(function(){
  16. console.log(this.id);
  17. }.bind(self),1000)//btn
  18. }
  19. //第三种
  20. btn.onclick=function(){
  21. // console.log(this.id);//btn
  22. setTimeout(function(){
  23. console.log(this.id);
  24. }.bind(this),1000)//btn
  25. }
  26. //箭头函数,解决this关键字的指向问题
  27. btn.onclick=function(){
  28. setTimeout(()=>{
  29. console.log(this.id);
  30. },1000)
  31. }
  32. </script>