携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
this指向
在JavaScript中,this是最为复杂的机制之一。他是一个很特别的关键字,在不理解的人眼中,this的指向永远是一个谜。
function identify() {
return this.name.toUpperCase();
}
function speak() {
var greeting = "Hello, I'm " + identify.call( this );
console.log( greeting );
}
var me = {
name:"Kyle"
};
var you = {
name:"Reader"
};
identify.call( me ); // KYLE
identify.call( you ); // READER
speak.call( me ); // Hello, 我是 KYLE
speak.call( you ); // Hello, 我是 READER
借用你不知道的JavaScript中的代码片段,这段代码可以在任何上下文中重复随意的使用,而不会影响函数的执行情况,而如果不使用this的话,就需要给函数传递一个显示的参数作为上下文对象来执行。随着使用模式越来越复杂,显示传递上下文对象也会让代码变得越来越混乱,使用this则不会这样。我们只需要确定好this的指向就可以了。这里在写文章的时候突发奇想,或许可以这样理解这两种函数调用
- 使用this时就像我们调用文件时输入文件的绝对路径,不管这个函数放到哪里,都可以通过绝对路径找到它
- 而使用上下文时,就可以理解为我把文件的相对路径放到地址栏中了,当然安静的使用它是没有任何问题的,而一旦移动这个函数的使用位置,就可能会发生不可预知的问题。
这个比喻当然不准确,但是只是用来明确this的好处来说,也是有可取之处的。
上面写了call函数,这是JS函数的原型方法,我们手写一个来理解一下call的妙处
call函数接受参数,第一个为指向的对象,后面的参数作为函数的执行参数。
首先将第一个参数来作为this的上下文
Function.propotype.myCall=function(context){
var context = context || window //当call没有参数时,将window设为函数上下文
context.fn = this // 将函数保存起来,由于是函数调用的myCall方法,所以this指向的是函数本身
const result = context.fn()
delete context.fn
return res
}
这就实现了给函数绑定this,然后实现将剩余参数给函数当参数使用
Function.propotype.myCall=function(context){
var context = context || window //当call没有参数时,将window设为函数上下文
context.fn = this // 将函数保存起来,由于是函数调用的myCall方法,所以this指向的是函数本身
//
let args = [...arguements].splice(1) //第一个参数作为上下文,第一个之后的所有参数为剩余参数
const result = context.fn(args)
//
delete context.fn
return res
}