美文网首页
this相关问题

this相关问题

作者: 饥人谷_阿银 | 来源:发表于2019-05-20 11:50 被阅读0次
  1. apply、call 、bind有什么作用,什么区别

回答
这三个方法均可以改变调用函数的this指向

call()方法:将调用函数中的this指向call方法的第一个参数,并将call方法第一个参数之后的参数列表传入调用函数中
apply()方法:apply方法与call方法功能类似,只不过其接受的不是参数列表,而是一个数组或类数组对象
bind()方法:将this指向传入的第一个参数,并返回一个新函数
利用这三个方法可以实现类属性和自身方法的继承;同时,对于一些类数组对象,因为其并不是真正的数组,所以并不存在数组方法,因此我们可以利用apply方法,让其调用数组方法

第 2 题
以下代码输出什么?

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

回答
"John: hi!"
解析:john.sayHi()可理解为john.sayHi.call(john),即this指向john,输出即为John.firstName + ":hi!"
第 3 题
下面代码输出什么,为什么

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

回答
输出:window
该函数内的this是在全局作用域下,所以this指向window
解析:func()可理解为func.call(null),浏览器里有一条规则:
如果你传的 context 就 null 或者 undefined,那么 window 对象就是默认的 context(严格模式下默认 context 是 undefined)
因此上面的打印结果是 window。

第 4 题
下面代码输出什么

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

回答
第一个console.log(this)输出:document
第二个console.log(this)输出:window
解析:点击页面监听click事件属于方法调用,this指向事件源DOM对象,即obj.fn.apply(obj),setTimeout内的函数属于回调函数,可以这么理解,f1.call(null,f2),所以this指向window

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

var john = { 
  firstName: "John" 
}

function func() { 
  alert( this.firstName )
}
func.call(john) 

回答
"John"
call方法改变了func中this的指向,将其指向john对象

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

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

  showMsg: function(){
    console.log('饥人谷');
  }
}

回答
执行console.log(this)的时候,this代表$btn
执行this.showMsg()方法时会报错,因为this指向的是$btn这个对象,而这个对象上并不存在showMsg()这个方法,因此报错;
修改方法;只需要将this指向module这个对象即可,可通过bind传入this,如下:

//修改方法一
var module= {
  bind: function(){
     var _this = this // this指是 module对象
    $btn.on('click', function(){
      console.log(this) //  this指还是 $btn
      _this.showMsg();
    })
  },

  showMsg: function(){
    console.log('饥人谷');
  }
}
//方法二
var module= {
  bind: function(){
    $btn.on('click', function(){
      console.log(this) // this指的是module对象
      this.showMsg();
    }.bind(this))
  },

  showMsg: function(){
    console.log('饥人谷');
  }
}
//方法三:箭头函数
var module = {
    bind() {
        $btn.on('click', () => {
            console.log(this)
            this.showMsg();
        })
    },
    showMsg() {
        console.log('hello');
    }
}

相关文章

  • this 相关问题

    问题1: apply、call 、bind有什么作用,什么区别 apply call bind 问题2: 以下代码...

  • this相关问题

    this 相关问题 1: apply、call 、bind有什么作用,什么区别 apply执行一个函数,传入函数执...

  • this相关问题

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

  • 相关问题

    电子银行我行手机银行现可提升转账额度为30万(单笔/日均),需要在usb key网银里设置定向转账收款人。手机具备...

  • this相关问题

    apply、call 、bind有什么作用,什么区别 回答这三个方法均可以改变调用函数的this指向 call()...

  • tableView相关问题问题

    一、tableView刷新数据后的偏移量问题 在初始化tableView时对预算高度设置如下即可解决: 二、获取t...

  • Bitmap相关问题

    1.recycleBitmap是存储在native内存和java内存上,当其被对象回收的时候,需要分两部分来回收,...

  • homebrew相关问题

    1、报错Unexpected header files:/usr/local/include/node/ares....

  • Spring 相关问题

    什么是Spring Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是...

  • 宿舍相关问题

    【关于的宿舍问题】 入学分配宿舍是定死的床位可以自己挑先到先得!不能更改!不能更改!不能更改! 男生在九号楼 六人...

网友评论

      本文标题:this相关问题

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