js基础5(this)

作者: 逆_3ec2 | 来源:发表于2018-08-27 18:25 被阅读0次

    1、this的认识

    1. 默认绑定
    • 全局环境中this默认绑定到window顶层对象
    • 自执行函数this,也就是函数独立调用(自执行,不是事件函数),this绑定在window
    • 被嵌套的函数,独立调用,this默认绑定到window
    • 闭包中函数独立调动,而不是方法调用,this默认绑定到window
    2. 隐式绑定
    • 一般被直接对象包含的函数调用时,也叫方法调用,this存在隐式的绑定到该对象
    3. 隐式丢失
    • 隐式丢失是指被隐式绑定的函数丢失绑定对象,从而默认绑定到window
      console.log(this); // 指向window
      
      function fun (){
        console.log(this);
      }
      fun(); // 指向window
    
      //自执行this
      var a = 0;
      var obj = {
        a: 2,
        foo: function (){
          function test (){
            console.log(this.a);
          }
          test();
        }
      }
      obj.foo(); // 指向window
    
      //闭包中的this
      var a = 0;
      function foo (){
        var a = 2;
        function test (){
          a = 3;
          console.log(this.a);
        }
        return test;
      }
      foo()(); // 指向window
    
      //隐式绑定
      function fun (){
        console.log(this.a);
      }
      var obj1 = {
        a: 1,
        foo: fun,
        obj2: {
          a: 2,
          foo: fun
        }
      }
      obj1.foo(); // 指向obj1
      obj1.obj2.foo(); // 指向obj2
    
    // 隐式丢失
    var a = 0;
    function fun (){
      console.log(this.a);
    }
    var obj1 = {
      a: 1,
      foo: fun
    }
    obj1.foo(); // 这是一个对象下的方法隐式绑定,所以绑定对象是obj1
    var bar = obj1.foo; // 把obj1.foo赋值给bar变量,造成隐式丢失,
    // 是因为这个变量和这个对象obj1毫无关系,就是绑定到window
    bar(); // 指向window
    
    // 隐式丢失
    var b = 0;
    var bar1 = function(){  
            var b = 2;
        console.log(this.b);
    };
    bar1(); // 指向window
    
    // 隐式丢失
    var a = 0;
    function fun (){
      console.log(this.a);
    }
    function bar (fun){
        fun();
    }
    var obj = {
        a: 2,
        foo: fun
    }
    obj.foo(); // 指向obj,对象方法来执行函数声明,隐式绑定该对象
    bar(obj.foo); // 隐式丢失,指向window --- 把函数当参数传递会造成隐式丢失
    

    2、严格模式

    开启严格模式:"use strict",避免未声明变量泄露

    3、改变this指向

    • 显示的绑定:
      • call():会自执行
        • call()不传递参数的时候,默认指向window
        • call()传递参数的时候,第一个参数必须指向 某一个对象,后面的参数就是形参
      • apply():会自执行
        • 接受两个参数,第一个是指向的某一个对象,第二个必须是一个数组,也是形参
      • bind():不会自执行
        • 接受两个参数,第一个是指向的某一个对象,第二个参数,也是形参
    let wrap = document.getElementById("wrap");
         json = {
           a = 2,
           b = 3;
         }
    
    // call()
    function fun (x){
      console.log(this.a + this.b);
      console.log(x);
    } 
    wrap.onclick = fun; // 事件函数this指向调用的这个对象
    fun.call(json, 2); // 输出5,2,this指向json,这里的实参2,传递到fun()的形参里面
    
    // apply()
    function fun (x, y){
      console.log(this.a + this.b);
      console.log(x + y);
    } 
    wrap.onclick = fun; // 事件函数this指向调用的这个对象,输出50
    fun.apply(json, [3,3]); // this指向json,数组的参数传递到函数fun()的形参里面
    
    // bind()
    let json= {
      a: 1,
      b: 2
    };
    wrap.onclick = fun.bind(json, 20);
    function fun (x){
      console.log(this.a);
      console.log(x);
    }
    

    相关文章

      网友评论

        本文标题:js基础5(this)

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