this 相关问题

2017-05-15  本文已影响30人  辉夜乀

问题1: apply、call 、bind有什么作用,什么区别

  • apply
fn.apply(context, [parm1, parm2, parm3])
/*调用函数,只接受2个参数,
第一个context是函数的执行上下文,内部的 this 指向 context
第二个是一个数组,里面包含传递进去的参数
*/
  • call
fn.call(context, parm1, parm2, parm3)
/*调用函数,能接受多个参数,
第一个context是函数的执行上下文,内部的 this 指向 context
后面的都是传递进去的参数
*/
  • bind
fn.bind(context)
/*返回一个函数,新函数的执行上下文为context 
只接受一个参数,新函数内的this指向context
*/

问题2: 以下代码输出什么?

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

//John:hi!

问题3: 下面代码输出什么,为什么

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

/*window
原因:
this指的是,调用函数的那个对象,func 函数的调用对象为 window
--另一种解释--
func() 等价为 func.call(undefined)
当传入的 context 为 undefined 或 null 时,window 对象就是默认的 context
this 就是 window
*/

问题4:下面代码输出什么

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

/*document  window
this 指的是,调用函数的那个对象
addEventListener 函数的调用对象是 document,所以第一个 this 是 document
setTimeout 函数的调用对象是window,所以第二个 this 是 window
*/

问题5:下面代码输出什么,why

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

/*John
func 函数用call方法调用,第一个参数就是this,
func 函数内的 this.firstName 就是john.firstName,也就是 John
*/

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

var module= {
  bind: function(){
    $btn.on('click', function(){
      console.log(this)     //this指什么,this指$btn
      this.showMsg();       //这个this指的是$btn
    })
  },
  
  showMsg: function(){
    console.log('饥人谷');
  }
}

/*会报错,因为代码中的 this.showMsg() 这个 this 是指 $btn 而不是对象 module,
$btn 上没有 showMsg 这个方法,所以会报错
*/

修改代码

//修改代码,把指向module对象的this保存起来
var module= {
  bind: function(){
    var _this = this        //把指向module对象的this保存起来
    $btn.on('click', function(){
      console.log(this)     //this指什么,this指$btn
      _this.showMsg();      //_this为module对象
    })
  },
  
  showMsg: function(){
    console.log('饥人谷');
  }
}
上一篇下一篇

猜你喜欢

热点阅读