this

2018-12-03  本文已影响11人  不是我的简书

this 的值到底是什么?一次说清楚

1、apply、call 、bind的作用与区别?

call、apply 调用一个函数,传入函数执行上下文及参数
call、apply 通过设置函数内部的this和函数的参数来调用函数并返回函数的返回结果

fn.call(context, param1, param2...)   
fn.apply(context, paramArray)

第一个参数都是希望设置的this对象,不同之处在于call方法接收参数列表,而apply接收参数数组

fn.bind(thisArg[, arg1[, arg2[, ...]]])

bind() 最简单的用法是创建一个函数,使这个函数不论怎么调用都有同样的 this 值。

红框中的内容是等价的

bind 把函数的this及部分参数固定为某个值,返回一个新的函数,调用新的函数的时候可以继续传入参数,最终已固定的参数和继续传入的参数会一起传给原函数,并把原函数的返回值返回。

curry (自动bind)每次都固定剩下的参数,直到传入的参数达到预定数量以后才真正调用原函数并返回。一般来说curry不会传入this

2、练习

1: 下面代码输出什么,为什么

var john = { 
  firstName: "John" 
}
function func() { 
  alert(this.firstName + ": hi!")    //弹出 John: hi!
}
john.sayHi = func
john.sayHi()    //等价于john.sayHi.call(john),this指向的是john  

2: 下面代码输出什么,为什么

func()    //等价于 func.call(undefined),可以简写为 func.call()
function func() { 
  alert(this)    //弹出window
}

按理说打印出来的 this 应该就是 undefined 了吧,但是浏览器里有一条规则:

3:下面代码输出什么

document.addEventListener('click', function(e){
    console.log(this);    //document,绑定事件中的this指向事件源
    setTimeout(function(){
        console.log(this);    //window,setTimeout、setInterval这两个方法执行的函数this也是全局对象
    }, 200);
}, false);

4:下面代码输出什么,why

var john = { 
  firstName: "John" 
}

function func() { 
  alert( this.firstName )     //弹出John
}
func.call(john)    // call()传入的第一个参数是希望设置的this对象,指定了this为john

5: 以下代码有什么问题,如何修改

var module= {
  bind: function(){
    var _this = this    //保存一个this
    $btn.on('click', function(){
      console.log(this) //this指什么:事件绑定的回调函数中的this是指绑定的元素,这里this指$btn
      _this.showMsg();    //但是$btn上是没有showMsg方法的,需要使用刚才保存的this
    })
  },
  
  showMsg: function(){
    console.log('lalala');
  }
}
上一篇 下一篇

猜你喜欢

热点阅读