js中创建一个值,分为三部分:
1、创建一个值(如果这个值是基本类型值,就直接在栈内存中直接创建,如果是引用类型值,需要在堆内存开辟一个新的空间,把里面的内容存储进去)
2、创建一个变量(先把值创建好后,才是创建变量)
3、让值与变量相关联
所有的指针赋值都是关联指向
接下来会以一些实例来加以说明。
var obj = {
name:"xiaoming",
fn:(function(a){
return function(){
console.log(a);
}
})(obj.name)
}
很显然你运行这段代码是会报错的,根据我们这三条规则来看,第一个创建一个值,这个值是引用类型的值,所以在堆中开辟一个地址来存放这个对象的内容
他会把fn里面的立即执行函数执行完把值赋给fn,而这个时候,obj还未被定义(其实这个时候他已经定义了,只是因为变量提升的原因,用let定义的话是不会被定义的),这时候的onj是undefined,让undefined.name是会报错的,因为undefined他不是一个引用值。至于其他的基本类型值后面点什么不会报错是什么原因,是包装类的内容,这里不展开讲,后期会讲到。
第三才是变量关联,这时候报错了,代码无法执行到这一步。
这些值都放在哪里呢,都会放在VO(G)中,VO(G)是什么东西会在下另一篇文章介绍。