联动水文,大约半年前记录了Javascript的this。顺水推舟理一下call(),bind(),apply()
扩展阅读:关于JavaScript的this
还是上次的代码,修改一下
let name = 'panda'
let obj = {
name: 'koala',
getName() {
return this.name
}
}
let test = obj.getName
test() //undefined.
(敲黑板!)复习一下!为什么就undefined
了!原因就是,this
指向不同了。那么直接运行是否可以
let name = 'panda'
let obj = {
name: 'koala',
getName() {
return this.name
}
}
obj.getName() //koala
因为有时候并没办法这么自由的随便调用,那如果要搞个变量出来用,怎么做?
call()
call
- vi. 呼叫;拜访;叫牌
- vt. 呼叫;称呼;召集
- n. 电话;呼叫;要求;访问
- n. (Call)人名;(瑞典、罗)卡尔;(英)考尔
以上来自有道翻译
有一手有道翻译就方便了,就是call(叫)它,把要用的方法call(叫)出来。
let name = 'panda'
let obj = {
name: 'koala',
getName() {
return this.name
}
}
let cal = obj.getName //先定义出来
cal.call(obj) //koala (指向还给他,不动其他把它叫出来
apply()
apply
- v.应用;使用;涂;敷
- Web申请;适用;套用
以上来自bing词典,感谢微软爸爸
再来一手必应翻译简直就是,不谈了!
let name = 'panda'
let obj = {
name: 'koala',
getName() {
return this.name
}
}
let apy = obj.getName //这手还是不变
apy.apply(obj) //koala (可以说不是指向还给他,这不是假装了,而是直接套用
有人要问,那你这手跟call()
不是一样的么,为什么要区分开来。这个问题下面再讲
bind()
是不是以为我要用百度翻译了?我偏不!
bind
n. 窘境;讨厌的事情;捆绑;植物的藤蔓
v. 捆绑;约束;装订;(使)结合;使关系密切
以上来自沪江小d,我学日语就靠它
顺便,请以上三家公司尽快给我打钱,谢谢合作。
bind()
有点土匪的意思,它就是想抢走你老婆借用一晚的意思。
let name = 'panda'
let obj = {
name: 'koala',
getName() {
return this.name
}
}
let bid = obj.getName // [Function: getName] (这手还是不变
// 接着这样做,把this指向回去,变成一个可以自由操作的变量
bid = bid.bind(obj) // [Function: bound getName]
bid() // koala (这样才会运行,因为刚刚只是抢过来了
call()和#apply()区别
let name = 'panda'
let obj = {
name: 'koala',
getName() {
return this.name
}
}
let cal = obj.getName
cal.call(obj) //koala
let apy = obj.getName
apy.apply(obj) //koala
说是这么说了,可是,他们并不是说就这么改变this
方向然后就没什么用处了啊,可以借用call()
和apply()
传参数的。
let name = 'panda'
let obj = {
name: 'koala',
getName(param1, param2) {
return this.name + ' params: ' + param1 + param2
}
}
let cal = obj.getName
cal.call(obj, 1, 2) //koala params: 12
那么apply()
就有区别了?哎!
let apy = obj.getName //这手还是不变
apy.apply(obj, [1, 2]) //koala params: 12
apply
后面接参数,只接受数组,call
的话按顺序怼进去就行了。就这点区别。
暂时先这样,以后更深入的使用再深入的理解一下。现在大概就用到这些。
下一篇,讲Javascript的柯基化!