一、关于this:
一)、为什么要用this?
function identity() {
return this.name.toUpperCase();
}
var me = {
name: "Kyle"
};
var you = {
name: "Reader"
};
identity.call(me); // Kyle
identity.call(you); // Reader
观察上面的代码,使用了this,identity函数就不再需要为每一个对象编写不同版本的函数。
回想之前学习的词法作用域,如果我们想要使用词法作用域来完成类似的功能,应该这样写:
// 显式传入一个上下文对象
function identity(context) {
return context.name.toUpperCase();
}
// ...
identity(me); // Kyle
identity(you); // Reader
显然,使用this的写法更加优雅。它的作用就是隐式“传递”一个对象引用。
二)、关于this的说明:
1、this并不指向函数自身:
JS中函数是一个对象,因此是可以在调用函数时存储状态的,但是this并不会指向函数本身。
2、this的作用域:
this在任何情况下都不指向函数的词法作用域。在JS内部,作用域确实和对象类似,可见的标识符都是它的属性。但是作用域“对象”无法通过JS代码访问,它存在于JS引擎内部。
- this无法与词法作用域共存!
三)、this到底是什么:
this是 动态作用域的表亲,this的绑定与函数声明的位置无关,而是取决于函数的调用方式。
当一个函数被调用时,会创建一个活动记录(执行上下文)。这个记录会包含函数在哪里被调用(调用栈)、函数的调用方法、传入的参数等信息。this就是记录的其中一个属性,会在函数执行的过程中用到。