自我学习而已——javascript——变量,作用域和内存问题

1.5种基本数据类型都是按值访问,包括string类型;object是按引用访问,按引用访问的话可以动态添加属性

2.javascript所有的参数都是按值传递

  javascript内的所有函数的参数都是按值传递的,如果参数是基本类型的数据,那么这个值会被复制给一个局部变量(argument[i]),如果传递的参数是一个引用类型值的话那么这个值在内存中的地址将会复制给一个局部变量。关于引用类型数据传递:

function setName(obj) {
            obj.name = "xiaosi_1";
            obj = new Object();
            obj.name = "xiaosi_2";
        }

        var xiaosi = new Object();
        setName(xiaosi);
        alert(xiaosi.name);
View Code

 

返回的值是"xiaosi_1",因为函数的参数变量实际上存储的只是一个地址,重新生成一个新的对象就断开了之前的地址连接,之后就不会有影响了,这点需要特别注意

3.javascript没有块级作用域,有执行环境

  javascript有自己的执行环境机制,一个变量的执行环境在其所声明的函数内(活动对象AO)或者是全局环境(变量对象VO),只有2种,而且javascript不像c和c++有块级作用域,所以不是花括号包起来就代表这个变量的作用域就在这个范围之内,而是在这个函数之内

if (true) {
            var color = "red";
        }
        alert(color);
View Code

 

在上面这个例子之中,if内部声明的变量执行环境是全局的,并不是只在if语句内,所以返回值是red,但是如果改为

 function show() {
            if (true) {
                var color = "red";
            }
        }
        alert(color);
View Code

那么显然会报一个未定义错误。

  另一方面,javascript的查询标识符机制就和执行环境一个道理,不过反过来就是了。当出现多个同名变量的时候,选择离自己执行环境最近的哪一个就是了

var color = "blue";
        function getColor() {
            var color = "red";
            return color;
        }
        alert(getColor());
View Code

那么这个返回值就很好理解,就是最近的变量red了。

4.javascript的作为属性的变量

  1.全局变量:声明一个javascript的全局变量的时候实际上就是定义了全局对象(global object 在执行任何javascript之前,javascript的解释器开始运行的时候产生的)的一个属性;

  2.局部变量:声明一个javascript的局部变量的时候实际上就是定义了调用对象的(call object)一个属性。在执行一个函数的时候,函数的参数和局部变量就是作为调用对象的属性而存储的,这个调用对象时完全独立的,这样就可以保证局部变量不会覆盖掉同名的全局变量;实际上,call和apply函数改变的就是调用对象,使得这个属相可以在另一个调用对象下使用;

5.javascript的垃圾回收机制

javascript的垃圾回收机制是自动回收,如果要手动回收的话就把该对象的值设为null就可以了,这个方法叫做解除引用,主要适用于全局变量和变量的属性,局部变量会在执行环境结束后自动回收,但是这种解除引用方法并不是立即回收相关内存,而是让值脱离执行环境,方便下一次垃圾收集器回收内存

 

 

posted @ 2013-06-28 16:01  小斯新手  阅读(148)  评论(0编辑  收藏  举报