这是我参与8月更文挑战的第十一天,活动详情查看:8月更文挑战
关于this
this关键字是JavaScript中最复杂的机制之一。它是一个很特别的关键字,被自动的定义在所有的函数作用域之中。相信很多初学JavaScript的同学都和我一样搞不清this到底指向什么。实际上,JavaScript中的this往往是因为我们把理解过程复杂化才导致学习起来很困惑。
要搞清楚this的指向,首先我们要搞明白,this到底是个什么玩意。this是在运行时进行绑定的,并不是在编写时绑定的,它的上下文取决于函数调用时的各种条件。this的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。
当一个函数被调用是,会创建它的执行上下文。这其中包括了函数在哪里被调用(调用栈)、函数的调用方式、传入的参数等信息。this就是这个记录的一个属性,会在函数执行的过程中用到。 说白了,this实质上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用。
调用位置
在理解this的绑定过程之前,首先要理解调用位置:调用位置就是函数在代码中被调用的位置(而不是被声明的位置)。而寻找调用位置最重要的就是分析调用栈(就是为了到达当前执行位置所调用的所有函数),我们关心的调用位置就在当前正在执行的函数的前一个调用中。 例如:
function zijie(){
//当前的调用栈就是:zijie
//因此,当前的调用位置是全局作用域
console.log("zijie");
juejin(); //juejin的调用位置
}
function juejin(){
//当前的调用栈是zijie → juejin
//因此,当前调用位置是在zijie中
console.log("juejin");
baiqi(); //baiqi的调用位置
}
function baiqi(){
//当前的调用栈是zijie → juejin → baiqi
//因此,当前的调用位置是在juejin中
console.log("baiqi");
}
zijie(); //zijie的调用位置