js内存的机制

说的肯定有错的地方,让高手们贱笑了

首先来执行:
var str="abc";
上面这条语句,会让图中第一条红线建立起来,左侧的str是一个变量,它指向的是存储在栈中的一个字符串,这就是我们理解的“引用”,str只是一个指向真正内存的指针;
然后执行:
str+="de";
这时,堆栈中并不是和想象的一样将"abc"原地拼接一个"de",而是新建一个"de"字符串,操作str+"de"就等于是操作"abc"+"de",这时会在栈中生成一个全新的内存地址,它的值是"abcde",这并没有改变原来的"abc";
而这时,str的指向就会被改变,图中第一条红线会消失,第二条红线被建立,str变成引用了最新生成的字符串"abcde"。

再看下边,执行:
var obj1={x:1,y:1};
同上,会在内存中生成一个object;
执行:
var obj2=obj1;
这句的效果就是把obj2指向的地址变成和obj1的指向一样,两个变量都指向了那个object
这时如果执行:
delete obj1;
或者
obj1=undefined; 或者obj1=null;
则图中第三条红线就会消失,这么做的效果仅仅是不让obj1再引用任何东西了
那右边那个object何时会真正消失呢?
这时再次执行:
obj2=null;
这时,红线4也会消失
这样的话 过那么一小段时间后,js引擎发现没有任何变量在引用右侧的object,就会自己将它清除出去,这时它才真正不存在了

也许有些js引擎不是这个原理吧,比如IE6?

猜你喜欢

转载自595953668.iteye.com/blog/2317237