this有很多个名字,上下文,执行环境变量等等
还有的说this是调用对象的引用,谁调用,this指向谁
那this到底是个啥?
this只有在函数中才存在?
this为什么需要这个,解决的问题是啥?
首先先贴代码看看
此时函数中的this取到的是不同的a值
要究其根本,那我们先来说一下定义变量和函数时,计算机是怎么储存的。
例如,我们定义一个变量(对象)
let a = {
b: 1
}
我们是定义了一个a在栈中,同时会在堆中开辟一块空间,那么我们a是一个指针,存放的是开辟的空间地址。那么,我们如果要a.b取值的时候,那么我们的js引擎就会找到a,再通过a的内存地址找到空间,再通过存储空间找到属性b对应的值
那么我们的b是通过数据属性来存储值的,也就是
obj = {
foo: 5
}
那我们如果我们在对象中放的是方法呢?比如这样:
var obj = {
foo: function () {}
};
那我们foo的数据属性的value中放的应该是函数function的地址
由于我们的函数是单独开辟空间存储,所以他是谁调用,函数的内存地址就给哪一个对象的属性。所以它可以在不同的环境(上下文)执行
由于我们在函数中可以取变量,如
var f = function () {
console.log(x);
};
上面代码中,函数体里面使用了变量x。该变量由运行环境提供。
现在问题就来了,由于函数可以在不同的运行环境执行,所以需要有一种机制,能够在函数体内部获得当前的运行环境(context)。所以,this就出现了,它的设计目的就是在函数体内部,指代函数当前的运行环境。
所以,解答开头的问题
1那this到底是个啥?
this,是上下文,执行环境,就是执行对象的引用
2this只有在函数中才存在?
是的,只存在于函数中,普通函数,构造函数中都有
3this为什么需要这个,解决的问题是啥?
函数中,可以调用当前环境的属性或方法,但是我们的函数,是单独存放的空间中,它可以在任意对象中存在。也可以被任意对象调用。怎么确定到底是在哪一个对象中,哪一个执行环境下?所以,我们就用this来指代这个执行环境,调用函数的对象。