您的位置:首页 > Web前端 > JavaScript

javascript之变量作用域内存问题

2016-08-19 10:09 281 查看
       访问变量有按值和按引用两种方式,而函数的参数只能按值传递。把参数当成局部变量就行了。

var a = 10;
function add(num){
num += 10;
return num;
}
var r = add(a);
a=10,r=20//参数按值传递,所以不会改变a的值


var a = new Object();
function change(obj){
obj.name="hello";
obj=new Object();
obj.name="world";
}
a.name="hello"//因为参数按值传递所以函数只会改变a的值,不会改变引用。
obj=new Object()这里就是创建函数的局部对象了,函数结束就没了,不会改变a的引用。


      基本数据类型的赋值就是新生成一个新的变量然后赋值

var a = 5;
var b = a;//这里a和b都是5,但是两个是独立的。这是按值传递

      对象的赋值就是引用的同一个对象,对象改变所有的引用就会改变。

var a = new Object();
var b = a;//这里a和b就是引用的同一个对象,这是按引用传递
     instanceof表示xx是不是xxx对象的实例,Array和function是Object的子类。是的话返回true,不是返回false。

var a = new Object();
var b = new String();
a instanceof Object//true
b instanceof String//true
     局部可以访问全局的变量,全局不能访问局部的变量。局部访问变量先从自己内部开始查找,找不到就到上一级一找。

     if没有作用域,for有作用域,就是在{}中定义的变量是在最接近的环境中,而for(var i=0)i是在for中,for结束i就没了。var声明的变量是在最接近的环境中,如在function那就在这个function作用域内,如果不用var声明,就是全局变量。

       垃圾收集器有标记清除和引用计数两种,标记清除就是对变量进行标记,然后清除,常用的。引用计数是记录引用的次数来清除变量,不常用,存在循环引用时会出现问题,如a引用b,b引用a。可以自己解除引用,就是把不用的全局变量设置为null。这样垃圾收集器就可以回收,解除引用可以消除循环引用现象,对垃圾收集器有好处,所以应该及时的对全局对象,全局对象属性,循环引用变量解除引用。垃圾收集器有一个周期,但是可以调用方法来立即执行。基础类型保存在栈中,对象保存在堆中。

    确定哪种基本类型用typeof,确定哪种引用类型用instanceof。

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript