var obj={
//function 空间分配? 更特殊
// 函数负责功能封装 10行以上代码建议封装为函数
// 内部还可以再分配空间
// 堆
// this
foo:function(){
// this? 是在函数运行时决定的
// 函数的运行一定要有一个上下文环境
console.log(this.bar);
},
bar: 1
}
// 不同的运行方法 带来不同的结果
var bar=2; //设置为全局的bar
var foo = obj.foo; //函数的地址 &取地址便是函数体 这俩地址是一样的,但结果不一样,是因为运行的环境不同。
// 在全局中有bar=2,在对象中中有 bar=1
obj.foo(); //运行在对象范围 this->obj 输出1
foo(); //运行在全局范围 this->window(全局) 输出2
// console.log(obj.foo(),foo());
为什么同一个函数运行时,结果不一样?
obj.foo()在obj环境执行,
foo()在全局环境中执行
解释原理,理解this作用。
二: 内存的数据结构 < = > 地址
{a:1,b:2} => HashMap
JavaScript语言之所以有this的设计,跟内存里面的数据有关系,跟传统语言的this不一样面向对象中
var obj = {foo :5};
右边先执行,先生成一个对象。储存在内存中,地址给obj,引用是通过地址发生的 。
obj.foo的过程:
引擎chrome v8 先从obj拿到内存地址,从该地址取出原始对象
返回foo属性
三:函数
属性的值 可能是一个函数。
再往 下指了
引擎chrome v8 给函数单独分配内存,
将地址给foo属性
函数是一个单独的值,它可以再不同的环境(上下文)执行。
需要一个this来决定当前的上下文
四:环境变量
为什么要有上下文 环境?
JS再函数体内部,引用当前环境的其他变量
var f = function(){
var x=1;
console.log(x);
};
var obj={
x:1,
f:function(){
console.log(this.x);
//this指定上下文环境
}
}
函数是一个吃着碗里的,看着锅里的家伙。如果要去访问到其他的环境里的变量时,可以通过this来表示当前的上下文环境。