this

作者: 浩天天 | 来源:发表于2016-11-15 17:37 被阅读0次

    apply、call 有什么作用,什么区别

    答:

    • this的指向:
      this是函数内部的属性,既可以是全局对象、也可以是当前对象或者任意对象。但总有一个原则,指的是函数调用的那个对象。
      1.在全局调用的时候指向是window。
      2.作为对象的方法调用的时候指的是那个对象。
      3.构造函数的时候指的是构造出来的那个对象。
      4.在事件绑定中的this,指向调用事件绑定的document对象。
      5.函数嵌套中的function的this指向window。
      6.setTimeout和setlnterval中的this指向window。
    apply与call的作用:

    apply、call的作用是相同的,都是指定函数的this和参数来调用函数,使用apply与call可以使this的指向更为清晰。
    apply与call的区别,他们的区别在于传递给函数的参数,apply接收的是数组的形式,call接收的是多个参数。
    例子:

        var name = 'hello';
        var obj = {
            name: 'jirengu',
        };
        var obj1 = {
            name:'syc'
        };
    
        function sayName() {
            console.log(this.name)
        }
        //全局调用, 默认指向window
        sayName()//输出'hello'
        //作为obj的方法调用, 指向obj
        obj.sayName = sayName
        obj.sayName()//输出'jirengu'
        //使用call指定this值
        sayName.call(obj1)//输出'syc'
    
    

    代码:

    1.以下代码输出什么?
    var john = { 
      firstName: "John" 
    }
    function func() { 
      alert(this.firstName + ": hi!")
    }
    john.sayHi = func
    john.sayHi() //输出:John:hi!
    
    2.下面代码输出什么,为什么
    func() 
    
    function func() { 
      alert(this)
    }//输出[object Window] 因为它是全局对象调用的函数,所以是window
    
    3.下面代码输出什么
    function fn0(){
        function fn(){
            console.log(this);
        }
        fn();
    }
    
    fn0();//这里是全局调用函数所以是Window
    
    
    document.addEventListener('click', function(e){
        console.log(this);//这里的this指的是addEventListener的对象,所以是document
        setTimeout(function(){
            console.log(this);
        }, 200);
    }, false);//这里的setTimeout是全局调用的函数所以是window
    
    
    4下面代码输出什么,why
        var john = {
            firstName: "John"
        }
    
        function func() {
            alert( this.firstName )
        }
        func.call(john)
    //结果是john,因为call指向了this为john
    
    5.代码输出?
    var john = { 
      firstName: "John",
      surname: "Smith"
    }
    
    function func(a, b) { 
      alert( this[a] + ' ' + this[b] )
    }
    func.call(john, 'firstName', 'surname') 
    //结果为Jhon Smith因为call指定了传入对象为john而且它可以传入多个参数,所以结果是这个。
    
    6.以下代码有什么问题,如何修改
    var module= {
      bind: function(){
        $btn.on('click', function(){
          console.log(this) //当btm被点击的时候this指的btn
          this.showMsg();
        })
      },
      showMsg: function(){
        console.log('饥人谷');
      }
    }
    //
    

    问题:this,showMsg()当点击$btn时this指的是btn而不是module,所以饥人谷将无法被打印。
    修改:

    var module= {
      bind: function(){
       var cur = this;
        $btn.on('click', function(){
          console.log(this) 
          cur.showMsg();
        })
      },
      showMsg: function(){
        console.log('饥人谷');
      }
    }
    

    本文由作者和饥人谷所有 转载请注明出处。

    相关文章

      网友评论

        本文标题:this

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