一、根据函数调用方式的不同,就会指向不同的对象:

  • 以函数的形式调用时,this就永远指向window

    1. var name="zhang"
    2. function show(){
    3. console.log(this.name)
    4. }
    5. // 函数正常调用的时候 this指向window
    6. function go(){
    7. var name="lisi"
    8. show()
    9. }
    10. go() //window.go()
  • 以方法的形式调用时,this就是调用方法的那个对象

    1. function fun(){
    2. console.log(this.name)
    3. }
    4. var obj={
    5. name:"xuan",
    6. sayName:fun
    7. }
    8. obj.sayName() // xuan

二、改变函数中this指向

2-1、call

  1. var name="王五"
  2. var obj = { name:"瑄瑄" }
  3. function go(){
  4. console.log(this.name);
  5. }
  6. go() // 王五
  7. go.call(obj) // 瑄瑄

2-2、apply

  1. var names = "wangwu"
  2. var obj = {
  3. name: "xuanxuan"
  4. }
  5. function nam() {
  6. console.log(this.name)
  7. }
  8. // apply 可以改变函数内部关键字的指向 funName.apply(obj)
  9. nam.apply(obj)

2-3、bind

bind 绑定的函数不会马上执行,只是改变了函数上下文的执行环境

  1. var name = "window"
  2. var obj = {
  3. name: "xuan"
  4. }
  5. var show=function go(a, b) {
  6. console.log(this.name)
  7. console.log(a + b)
  8. }.bind(obj) //bind 绑定的函数不会马上执行,只是改变了函数上下文的执行环境
  9. // call apply 调用的时候马上执行
  10. show(5,6)

使用场景

  1. <button id="btn">按钮</button>
  2. <script>
  3. var id="1001";
  4. var btn = document.getElementById("btn")
  5. btn.onclick = function(){
  6. setTimeout(function(){ // window.setTimeout
  7. console.log(this.id); // 1001
  8. },1000)
  9. }
  10. </script>
  11. ## 解决
  12. # 1.使用bind解决
  13. btn.onclick = function(){
  14. setTimeout(function(){
  15. console.log(this.id);
  16. }.bind(btn),1000)
  17. }
  18. /* btn.onclick = function(){
  19. var self = this
  20. setTimeout(function(){
  21. console.log(this.id);
  22. }.bind(self),1000)
  23. }
  24. btn.onclick = function(){
  25. setTimeout(function(){
  26. console.log(this.id);
  27. }.bind(this),1000)
  28. }
  29. */
  30. # 2.使用箭头函数解决
  31. btn.onclick = function(){
  32. setTimeout(()=>{
  33. console.log(this.id);
  34. },1000)
  35. }

三、call和apply的区别

  • c**all:依次传递**
  • apply:需要传递数组

    1. var name="window"
    2. var obj={
    3. name:"xuan"
    4. }
    5. function go(a,b){
    6. console.log(this.name)
    7. console.log(a+b)
    8. }
    9. // go(5,6)
    10. // 传递多个参数
    11. // call:依次传递
    12. // apply:需要传递数组
    13. go.call(obj,5,6) // xuan 11
    14. go.apply(obj,[5,6])