首先我们看教科书里写的:this指的是函数运行时所在的环境。
接下来我们要弄清楚为什么会这样?也就是说,函数的运行环境到底是怎么决定的?举例来说,为什么obj.foo()就是在obj环境执行,而一旦var foo = obj.foo,foo()就变成在全局环境执行?
所以要理解this指向其实是要弄清楚方法的运行环境。
varobj={foo:1}
当我们将一个对象赋值给一个变量时,JavaScript 引擎会先在内存里面,生成一个对象{ foo: 1 },然后把这个对象的内存地址赋值给变量obj。
也就是说对象其实是一个地址,我们要拿到对象里的变量和方法,先要从内存里拿到地址,然后再从该地址读出原始的对象,返回属性。
varobj={foo:function(){}}
当对象属性值是一个方法时,引擎会将函数单独保存在内存中,然后再将函数的地址赋值给对象foo属性的value属性
普通变量:{foo:{[[value]]:5}}
属性值为方法时:{foo:{[[value]]:函数的地址...}}
由于函数是一个单独的值,所以它可以在不同的环境(上下文)执行。
varf=function(){};
varobj={f:f};
// 单独执行
f()
// obj 环境执行
obj.f()
网友评论