this之剑传说

26次阅读

共计 1229 个字符,预计需要花费 4 分钟才能阅读完成。

this 之剑传说
在 javascript 国,有个关于 this 之剑的传说,谁作为调用点,谁就是 this 的主人。
调用点是什么?调用点就是函数在代码中被调用的位置。
函数是 javascript 国的执法人员,作为一个人民公仆,当然是哪里需要搬哪里,而他执法需要一些震慑别人的武器,this 之剑就这样诞生了。但是函数不能时时刻刻都拿着武器走在大街上吧,所以 javascript 国法律规定,只有在执法 (被调用) 的时候 this 之剑才起作用。
你认为 this 之剑是属于函数的?那就大错特错了,想想我们刚才说的,调用点才是 this 的主人,那么谁是调用点呢?能调用函数的人还用说吗?当然是 javascript 国最大的官 window 了。
不信你试试
let name = ‘window’
function fn() {
let name = ‘function’
console.log(`I am ${this.name}`)
}

fn() // I am window
难道只有所有 this 的主人都是 window 了吗?那倒不是,window 作为大佬,手下没些小弟那怎么成,对象就是 window 的忠实小弟
name = ‘window’
const obj = {
name: ‘obj’,
fn: function () {
console.log(`I am ${this.name}`)
}
}

obj.fn() // I am obj
但有时候,对象旗下的函数能力有限,需要借助 window 的函数,作为 window 直属的函数就不乐意了:“我明明是大佬直属的部下,为什么要被你个小小的对象调用,我不服。”于是,window 直属的函数就会给对象使绊子,发泄自己的不满,只要是需要 this 之剑的时候,直属函数就百般刁难。
const someThing = ‘relax’
function windowFn() {
console.log(`let me do ${someThing}`)
}

const obj = {
someThing: ‘work’,
objFn: windowFn,
}

obj.objFn() // let me do relax
这可怎么办啊,对象也不是吃素的,你有张良计,我有过墙梯。对象决定告状!window 听了这种事,思索了一下,决定使用美人计,window 给每个函数分配了 call,apply 两个美女函数部下,这美人计还真有用,每个函数都成了裙下之臣,乖乖执行对象布置的任务。
const someThing = ‘relax’
function windowFn() {
console.log(`let me do ${someThing}`)
}

const obj = {
someThing: ‘work’,
objFn: windowFn,
}

obj.objFn.call(obj)
obj.objFn.apply(obj)
说到这两大美女啊,各有各的喜好,虽然做一样的任务,但是收参数的方式却不太一样,call 喜欢一个一个收,apply 喜欢打包成数组一起收。
关于 this 之剑传说我们暂时先说到这吧,欲知后事,下回分解。

正文完
 0