美文网首页
关于 this

关于 this

作者: Hunter_Gu | 来源:发表于2017-01-26 15:32 被阅读7次

    在 JS 中,this 特指调用函数的那个对象。
    如:

      <button>点击</button>
      $('button').on('click',function(){
          console.log(this);//<button>点击</button>
      });
    

    再比如:

    $(window).on('scroll',function(){
      console.log(this);//window 对象
    })
    

    在上述事件中,比较容易区分 this 特指哪个对象。
    但在有些情况下,不容易知道,如:

    function foo(){
      console.log(this);
    }
    

    下面是具体情况的讲解。

    1.作为函数调用时,this 指向全局对象

    function foo(){
      console.log(this);
    }
    foo();//window 对象
    

    再比如

    function foo(){
      function fn(){
        console.log(this);
      }
      fn();
    }
    foo();//window 对象
    

    还比如

    function foo(){
      function fn(){
       setTimeout(function(){
          console.log(this)
        },5000);
      }
      fn();
    }
    foo();//window 对象
    

    这些都是指向 window 对象的。

    2.作为对象的方法调用

    var obj1 = {
            name: 'Hunter',
            fn: function(){
              console.log(this);
              console.log(this.name);
            }
          };
    obj1.fn();//obj1, 可以理解为 obj1 在调用函数 fn... 所以 fn 可以通过 this.name 访问 obj1.name
    

    但是,有些需要注意的点

    var obj1 = {
            name: 'Hunter',
            fn: function(){
              console.log(this);
            }
          };
    var fn2 = obj1.fn;
    fn2();//window 对象。 因为 fn2 = obj1.fn; 相当于 fn2 = function(){console.log(this);} 这样的理解方式与典型的闭包很类似,这只是一个简单的赋值
    

    3.作为构造函数调用

    function f(name){
      this.name = name
      console.log(this)
    }
    var f1 = new f('a');//此时的 this 指向实例 f1 这个对象
    var f2 = new f('b');//此时的 this 指向实例 f2 这个对象
    

    this 的指向大概情况就是如此,只要注意是什么情况调用,并不复杂。

    另外,可以通过 call 或者 apply 来改变 this。下面进行简单的介绍。

    //Function.apply()
    function fn(){
      console.log(this)
    }
    var obj={
      name: 'hunter',
      age: '20'
    };
    fn.call(obj);//此时的 this 指向 obj
    

    apply 和 call 很类似,只是当函数接受参数时,apply是以数组的方式传递。

    function fn(arg1,arg2,arg3,...){
      console.log(this);
      console.log(arg1)
      console.log(arg2)
    }
    var obj ={
      name: 'hunter'
    }
    fn.call(obj,1,2,3)
    fn.apply(obj,[1,2,3])
    

    相关文章

      网友评论

          本文标题:关于 this

          本文链接:https://www.haomeiwen.com/subject/aqgxittx.html