浅析js中的this

很多人可能会有疑问,this到底是什么?为什么this的值变化多端?
  首先我们来概括下this.
  this是一个对象,一般存在于函数中,表示当前函数的执行上下文;
值得一提的是,当函数在执行后,this才有绑定的对象,函数未执行时,this没有内容
接下来我们看看在不同场景下的this的指向
  1.函数默认执行 :此时this指向Window
  function fn(){
        console.log(this)    //Window
    };
fn();
  在严格模式开启后,this的指向又有所不同

严格模式下 : this指向undefined

  function fn(){
      "use strict"
        console.log(this)    //undefined
    };
    fn();
  2.函数的隐式执行 : this指向函数的直接执行对象
  function fn(){
             console.log(this);    
          };
          var a = 10;
          var obj = {
              a:20,
             b:fn
          };
         obj.b();        //this指向obj
        var obj2 = {
             a:30,
             b:obj.b
         };
         obj2.b();       //this指向obj2
        var obj3 = {
             a:40,
            b:obj2        
        };
        obj3.b.b();      //obj3.b.b等价于obj2.b this指向obj2

但当函数作为参数传到另一个函数的变量时, 发生隐式丢失,this指向Window

function fn(){
            console.log(this)       //Window
        };
        var obj = {
            a:20,
            b:fn
        };
 setTimeout(obj.b, 1000);
        function setTimeout(cb,t){
            cb();              //obj.b作为参数传给cb,而cb前没对象,相当于默认方式执行fn() 
        };

    3.函数的显式执行 : this指向指定对象

我们可以通过函数的bind、call、apply方式指定this的对象,还可以用来修复上文中的隐式丢失

   var obj = {
        name: "obj",
        show: function () {
            console.log(this.name)
        }
    }
    obj.show();                     //obj

    var obj2 = {
        name: "obj2"
    };
    obj.show.bind(obj2)();          //obj2

    var name = "蜡笔笑嘻嘻";         
    obj.show.bind(window)();     //Window

    4.构造函数执行(通过new执行)

构造函数中的this 会指向创建出来的实例对象

    function Person() {
        this.name = 'zhar';
    }
    var p = new Person();
    console.log(p.name);        //zhar
  以上就是对于this的一些理解,欢迎沟通和交流.

 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/mutuo/p/11438356.html
今日推荐