关于this的误解
首先,this并不是像它的英语意思一样指向函数本身
来看个例子
function showThis(){
this.count++;
console.log(this.count);
}
showThis.count=0;
showThis();//NaN
console.log(showThis.count);//0
如果this指向调用函数本身的话
输出的应该是1才对,为什么调用时输出的是NaN和0呢?
这段代码中,showThis.count确实给showThis创造了一个count属性并赋值为0
但是执行函数的时候this指向的是window对象,也就是说调用的实际上是window.showThis() (因为showThis被声明在全局作用域)
第二种常见的误解是,this指向函数的作用域
首先确定一点,this在任何情况下都不指向函数的词法作用域
JavaScript中的作用域确实和对象类似,可见的标识符都是它的属性
但是作用域"对象"无法通过JavaScript代码访问,它存在在JavaScript引擎内部
this是什么
首先,this是在运行时进行绑定的,与作用域不同,作用域是在定义时绑定,与执行位置无关
因此,this的绑定和函数声明的位置没有任何关系,只跟调用函数的方式有关
当一个函数被调用时,会创建一个活动记录(执行上下文)
包括了函数在哪里调用(调用栈),调用方式,传入的参数等
this就是这个记录的一个属性
因此,this实际上是在函数被调用时发生的绑定,指向什么完全取决于函数在哪里被调