JavaScript学习(三) 变量 作用域和内存

来源:互联网 发布:电视的mac 编辑:程序博客网 时间:2024/05/16 17:40
一 变量:JavaScript的变量为松散型,并不是强制类型不同的数据类型分为:基本类型值和引用类型值。基本类型值:栈内存中简单数据段,即这种值完全保存在内存中的一个位置引用类型值:保存在堆内存中的对象,即这种值保存的实际上只是一个指针,该指针指向内存中的另一个位置,该位置保存对象。1.基本类型值:Undefined,Null,BooleanNumberString堆内存的大小不固定,可将内存地址保存在栈内存中。2.动态添加属性var box=new Object();box.name='lee';      //添加一个属性alert(box.name);var box='Lee';       //基本数据类型,是字符串box.age=28;          //不是引用类型,不能添加动态属性3.复制变量值var box='Lee';var box2=box;//它们两个完全独立,也就是说两个变量,分别操作时,互不影响。var box=new Object(); //创建一个引用类型box.name='Lee';       //新建一个属性var box2=box;         //把引用地址赋值给box2box.name='aaa';  //因指向同一个指针,此时box.name='aaa'4.传递参数所有的函数都是按值传递是我,言下之意就是说,参数不会按引用传递,虽然变量有基本类型和引用类型之分。function box(num){   num+=10;   return num;}var num=50;alert(box(num)); //打印60 按值传递alert(num);      //50;//如果是按引用传递,函数里面的num会成为类似全局变量,把外面的num替换掉,也就是说alert(num) 打印60;单js里面不打印。function box(obj){  //将要传递一个引用类型的参数,但是不是按引用传递   obj.name='Lee';   var obj=new Object();    obj.name='kkk';   //必须通过传参才行,JS没有传递引用的功能}var obj=new Object();box(obj);aler(obj.name); //打印Lee,当方法内obj为kkk时,依然打印'Lee'//按引用传递和传递引用类型是两个不同的概念function box(obj){   obj.name='Lee';   var obj=new Object();  //函数内部又创建了一个对象   obj.name='Mr';         //并没有替换掉原来的obj}最后得出结论:ECMAScript函数的参数都将是局部变量,也就是说,没有按引用传递。5.检测类型typeOf:检测一个变量的类型数组和null都是Object,这时应采用intanceOf运算符来查看box intanceOf Array   //是否是数组box intanceOf RegExp  //是否是正则表达式当使用intanceOf检查基本类型值时,它会返回false
作用域:1.执行环境及作用域执行环境定义了变量或函数有权访问其他的数据,决定了它们各自的行为全局变量和函数都是作为window对象的属性和方法创建的var box='blue';function setBox(){  //window的属性和方法  alert(box);      //全局变量可在函数里访问}setBox();         //执行方法var box='Lee';function setBox(){   var box='red';   //局部变量}alert(setBox());    //打印bluealert(box);         //打印'Lee'var box='Lee';function setBox(box){   alert(box);}setBox('red');alert(box);    //打印red,通过传参,也是局部,在setBox下var box='Lee';function setBox(){  function setColor(){      var b='kkk';      alert(b);      return 123;  }  return setColor();}alert(setBox());//作用域链,不能使用setBox().setColor();2.没有块级作用域if(true){   var box='Lee';   //if语句的{}没有封闭作用域的功能}for(var i=0;i<10;i++){    var box='Lee';    //i和box依然是window下的}function box(){   var num=10;   //局部变量   num=10;       //全局变量,不建议使用}变量访问中,局部变量要比全局变量更快,因为不需要向上搜索作用域链
内存问题:标记清除:给存储在内存中的变量加上标记,去除掉正在运行的变量标记,定期回收var box={   name='Lee';}box=null;   //解除对象引用,等待垃圾回收
原创粉丝点击