javascript this小结

157 阅读1分钟

js作为一门动态语言,this的指向往往令人疑惑。js中的this总是指向一个对象。而这个对象是在运行时基于函数的执行环境动态绑定的。

实际应用中,this的指向通常分为四大类。

  • 作为对象的方法调用
  • 作为普通函数调用
  • 构造器调用
  • Function.prototype.call 或Function.prototype.apply调用
  1. 作为对象的方法调用

         var obj = {
             a: 1,
             getA: function() {
                 console.log( this === obj );
                 console.log( this.a);
             }
         }
         obj.getA();
    

    当函数作为对象的方法调用时,this指向该对象。

  2. 作为普通函数调用

         window.name = 'globalName';
         var getName = function () {
             return this.name
         }
         
         console.log(getName());
         
         或
         window.name = 'globalName';
         
         var obj = {
             name: 'kobe',
             getName: function () {
                 return this.name;
             }
         }
         
         var getName = obj.getName;
         console.log(getName()); // globalName
    

    当函数作为普通函数调用时,this指向全局对象。在浏览器中即是window对象。

  3. 作为构造器调用

       var Person = function(name) {
        this.name = name;
      }
  
      var p = new Person('kobe');
      console.log(p.name);

当函数作为构造器被调用时,this指向该对象。

  1. Function.prototype.call 或Function.prototype.apply 调用
       var obj1 = {
         name: 'Ben',
         getName: function() {
           return this.name;
         }
       }
       
       var obj2 = {
         name: 'Jason'
       }
       
       console.log(obj1.getName()) // 'Ben'
       console.log(obj1.getName.call(obj2)) // 'Jason'
    
    Function.prototype.call 或Function.prototype.apply 可以动态改变传入函数的this。