一、JS中的this:
- this的指向与this所处在的环境有关。
- 在JS中this的设计与其内存的数据结构有关。
<script>
var object = {
foo:function(){
alert(this.num)
},
num:1
}
var num = 2;
var foo = object.foo
foo() //2,函数在全局环境下执行
object.foo()//1,函数在object环境下执行
</script>
二、JS中存储对象:
假设有obj={foo:3}这么一个对象。首先,JS会在内存里生成{foo:3}这么一个对象,然后将内存地址赋给object。如果你要读取foo属性的值,那么JS引擎就要在obj处取得地址,然后根据地址找到foo的原始对象,最后返回他的属性值。
原始的对象是字典结构:
{
foo: {
[[value]]: 3
[[writable]]: true
[[enumerable]]: true
[[configurable]]: true
}
}
foo属性的值保存在属性描述对象的value属性里
三、函数:
与上所诉不同的是,在obj={foo:function(){}}对象中,函数将单独存储在内存中,(这意味函数可以在不同的环境中运行,只要你想要。)
然后将函数地址赋给,foo属性的value属性
{
foo: {
[[value]]: 函数的地址
...
}}
在不同的环境下:
var f=function(){}
var obj={
f:f
}
f(); //大环境下
obj.f(); //obj小环境下
四、环境变量:
JS允许在函数体内部,引用当前环境的其他变量。
var f = function(){
console.log(this.x);
};
var x = 5;
var obj = {
f:f,
x:1,
};
f(); //5
obj.f(); //1
this.x指代的为运行环境的x。
回到最初:
因为obj.foo()是通过obj对象找到foo函数的,所以运行环境就是obj对象。但是当,var foo = obj.foo时,foo指向本身与obj没有关系。
参考文章:阮一峰