this

作者: Jeff12138 | 来源:发表于2017-10-05 14:56 被阅读0次

    1、apply、call 、bind有什么作用,什么区别?

    apply、call 、bind都被用来改变函数的this对象的指向。
    其中,apply和call都会直接调用函数。而二者的区别在于,call方法接收参数列表,而apply接收参数数组。
    而bind方法则会返回一个新函数,并且使函数内部的this指向传入的第一个参数。

    2、以下代码输出什么?

    var john = { 
      firstName: "John" 
    }
    function func() { 
      alert(this.firstName + ": hi!")
    }
    john.sayHi = func
    john.sayHi()
    

    输出:John: hi!
    因为sayHi()是被john调用,所以这里的this指向john,因此this.firstName即为John。

    3、下面代码输出什么,为什么?

    func() 
    function func() { 
      alert(this)
    }
    

    输出:window
    此时this指向全局作用域,因此this即为window。

    4、下面代码输出什么?

    document.addEventListener('click', function(e){
        console.log(this);
        setTimeout(function(){
            console.log(this);
        }, 200);
    }, false);
    

    分别输出 ‘ document ’ 和 ‘ window ’
    第一个this直接指向document;第二个this由于在setTimeout函数中,特指全局作用域,即window。

    5、下面代码输出什么,why?

    var john = { 
      firstName: "John" 
    }
    
    function func() { 
      alert( this.firstName )
    }
    func.call(john)
    

    输出:John
    因为call方法将this的指向对象改为了john,因此this.firstName即为John。

    6、以下代码有什么问题,如何修改?

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

    上面这段代码的问题在于this指向了$btn,而$btn是不包含showMsg()方法的,因此执行this.showMsg()时会报错。
    由于showMsg()方法在module中,因此我们只需要让this指向module即可。修改如下:

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

    相关文章

      网友评论

          本文标题:this

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