this是我们在开发中,最常见到的,刚开始学编程的时候,this给我看懵了,理解不了,this到底是干什么的,有什么作用
首先解释一下this是一个对象,在不同情况下this指向不同
对象调用时,this指向该对象
var obj = {
name:'kobe',
age: 41,
print:function(){
console.log(this)
console.log(this.name + ' ' + this.age)
}
}
obj.print() //this指向该对象
直接调用的函数,this指向的是全局window对象
function print() {
console.log(this)
}
print() //this指向的是window
通过new的方式,this永远指向新创建的对象
function person(name,age) {
this.name = name
this.age = age
console.log(this)
}
var p = new person('欧文',30) //this指向新创建的对象person
箭头函数中的this
const obj1 = {
a:()=>{
console.log(this)
}
}
obj1.a() //window
面试题 call( ) , apply( ) ,bind( )区别:
call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向
call() ,apply( )是立即调用函数
var obj = {
username:"kobe"
}
function foo(data){
console.log(this,data)
}
// 传参形式
foo.call(obj,33)
//直接从第二个参数开始,依次传入
foo.apply(obj,[33]) //放在数组里传入
// bind特点:绑定完this不会立即调用当前的函数,而是将函数返回
var bar = foo.bind(obj)
console.log(bar)
foo.bind(obj)()
bind( ) 不会立即调用,而是将函数返回,因此后面需要加( )才能调用, bind()传参方式和call一样
分析 :为什么ES 5中要加入bind( ) 方法改变this的指向? 因为bind( ) 不会立即调用当前函数
bind( ) 通常使用在回调函数中
call,apply,bind在面试时通常会让手写代码,明天会总结一下这三个方法的手动实现,
路漫漫其修远兮~~~