this
根据函数调用方式的不同,this的值也不同
- 以函数形式调用,this 是 window
- 以方法形式调用,this 是调用方法的对象
- 构造函数中,this 是新建的对象
- 构造函数中没有自己的 this,由外层作用域决定 this 指向。
call 和 apply
相同点
调用函数除了通过 函数( ) 这种形式外,还可以通过其他的方式来调用函数
- 通过调用函数的call( )和apply( )两个方法来调用函数。
- fn.call( )
- fn.apply( )
- 指定函数中的this
- call和apply的第一个参数,动态的指定this
function fn() {
console.log("函数执行了~", this)
}
const obj = {name:"孙悟空", fn}
fn.call(obj)
不同点
- 通过 call( ) 调用的实参,函数的实参直接在第一个参数后一个一个的列出来。
- 通过 apply( ) 调用函数,函数的实参需要通过一个数组传递。
function fn2(a,b) {
console.log("a=", a, "b=", b, this)
}
fn2.call(obj,"hello",true);
fn2.apply(obj,["hello",true])
bind( )
可以用来创建一个新的函数
- 第一个参数可以为新函数绑定 this,同call和apply一样,被绑定后的this无法修改。
- 可以为函数绑定参数,传参方式同 call,被绑定后的参数无法修改。
function fn() {
console.log("fn执行了~~~~",this)
}
const obj = {name:"孙悟空"}
const newFn = fn.bind(obj)
newFn.call({obj}) // fn执行了~~~~ {name:"孙悟空"} (被绑定后的this无法修改)
fn() // fn执行了~~~~ window
newFn() // fn执行了~~~~ {name:"孙悟空"}
箭头函数
箭头函数没有自身的this,它的this由外层作用域决定,无法通过call,apply 和bind 修改它的 this,箭头函数也没有arguments。