call apply bind 的用法
JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念 ;
在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向。
call、apply生成立即执行函数,生成即调用
fn.call(this,参数一,参数二,···)
fn.apply(this,[参数一,参数二,···])
bind是生成一个新的函数,想调用时在调用
fn.bind(this,参数一,参数二,···)()
注意:this为null或者undefined、this时,都指向window
function test () {
//this指向window,运行test()则将会在全局寻找name变量
console.log(this.name)
}
var obj1 = {
name: '测试1'
}
var obj2 = {
name: '测试2'
}
//使用call() 、apply() 、bind()等方法,改变this指向,不在指向window,指向传入的对象,从而找到name变量
test.call(obj1) // 输入测试1
test.apply(obj2) // 输入测试2
test.bind(obj1)() //输出测试1
个人理解
let obj={
name:'胡歌',
age:23,
love(women,toy){
console.log(this.name+this.age+'喜欢'+women+"和"+toy)
}
}
let newObj={
name:'霍建华',
age:'24'
}
obj.love('薛佳凝','托雷') //输出 胡歌23喜欢薛佳凝和托雷
obj.love.call(newObj,'胡歌','白豆腐') //霍建华24喜欢胡歌和白豆腐
obj.love.apply(newObj,['胡歌','白豆腐']) //霍建华24喜欢胡歌和白豆腐
obj.love.bind(newObj,'胡歌','白豆腐')() //霍建华24喜欢胡歌和白豆腐
可以这理解,调用obj对象的love方法时,本来里面的this指向obj对象,因为call()使得this指向了newObj对象,使用找变量时就找到了newObj中的同名变量
也可以这样理解,obj对象中的love方法被newObj对象借来使用,newObj对象暂时有了love方法,当newObj对象使用自己的方法时,this当然指向自己,即调用的自己内部的同名变量