this指针的原理(JavaScript)
this指向函数运行时所在的环境。
一、举例说明
var obj = {
foo: function() {
console.log(this.bar);
},
bar: 1
};
var foo = obj.foo;
var bar = 2;
obj.foo() // 1
foo() // 2
对于obj.foo()来说,foo运行在obj环境中,所以this指向obj;
对于foo()来说,foo运行在全局环境中,所以this指向全局。
二、变量存储结构
var obj = {foo: 5};
将一个对象赋值给变量obj,JavaScript引擎会在内存中生成一个对象{foo: 5},然后将内存地址赋值给变量obj。如果要读取obj.foo,引擎会拿到obj的内存地址,然后从地址中读出原始对象,返回它的foo属性。
原始的对象以字典的结构保存,如下图:
三、函数存储结构
var obj = {foo: function() {}};
这时,JavaScript引擎会将函数单独保存在内存中,然后再将函数的地址赋值给foo属性的value属性。如下图:
四、环境变量
由于函数可以在不同的运行环境下执行,所以需要一种机制,能够在函数体内部获得当前的运行环境。所以,this就出现了,它的设计目的就是在函数体内部,指代函数当前的运行环境。
var foo = function() {
console.log(this.x);
}
var x = 1;
var obj = {
foo: foo,
x: 2
};
//单独执行
foo() // 1
//obj 环境运行
obj.foo() //2
函数foo在全局环境下运行,this.x指向全局的x。
obj.foo(),在obj环境下运行,this.x指向obj.x。