变量类型:基本类型和引用类型

      基本类型上节已经提到。基本类型的值是按值传递的,既改变形参的值不会影响实参

  1. <html>
  2. <head>
  3. <meta charset="UTF-8">
  4. <title>Document</title>
  5. </head>
  6. <body>
  7. <script>
  8. var x=1;
  9. function a(o){
  10. o=100;
  11. alert(o);
  12. }
  13. a(x);
  14. alert(x);
  15. </script>
  16. </body>
  17. </html>

其中,a(x)为100  ,alert(x)为1  可见js的基本类型是按值传递的

      引用类型:由多个值构成的对象,是按照共享传递的,也就是对象属性的形参的改变会影响对象属型的改变,对象形参的改变不会影响对象的改变。

  1. <html>
  2. <head>
  3. <meta charset="UTF-8">
  4. <title>Document</title>
  5. </head>
  6. <body>
  7.  
  8. <script>
  9. var obj={x:1};
  10. function a(){
  11. arguments[0].x=2;
  12. }
  13.  
  14. a(obj);
  15. alert(obj.x);
  16. </script>
  17. </body>
  18.  
  19. </html>

可见alert(obj.x)为2  由此知对象属性的形参的改变会使对象的属性改变

  1. <html>
  2. <head>
  3. <meta charset="UTF-8">
  4. <title>Document</title>
  5. </head>
  6. <body>
  7.  
  8. <script>
  9. var obj={x:1};
  10. function a(){
  11. arguments[0]=2;
  12. }
  13.  
  14. a(obj);
  15. alert(obj.x);
  16. </script>
  17. </body>
  18.  
  19. </html>

alert(obj.x)为1  可见对象的形参的改变不会影响对象

  还有一点要注意的是,JavaScript有声明提前的特性,也就是说你可以先调用一个变量,然后声明,但是变量的赋值是不会提前的。

  1. <html>
  2. <head>
  3. <meta charset="UTF-8">
  4. <title>Document</title>
  5. </head>
  6. <body>
  7.  
  8. <script>
  9. alert( a);
  10. var a=1;
  11. </script>
  12. </body>
  13.  
  14. </html>

此时alert返回的结果是undefined ,可见a确实声明了

    在变量的复制过程中,按值传递与按共享传递也是不同,对于按值传递 在string基本类型中,每一次对字符串的修改操作,实际都是新建了一个变量。

  1. var a=1;
  2. var b=a;

其过程是a,b是完全独立的,这两个值参与的任何操作不会互相影响

    按共享传递

  1. var obj1={x:1};
  2. var obj2=obj1;
  3. obj2.x=2;
  4. alert(obj1.x);

此时,alert输出的值也为2,可见属性的改变时会相互影响的,但对象之间互不影响。

  instancof操作符   用于检查对象的类型,如Array,RegExp  用法实例:alert(colors instanceof Array); 其返回值为boolean

作用域

  (执行)环境:js的最重要的概念。每个执行环境都有一个关联的变量对象,改环境中的变量和函数都保存在这个变量对象中,解释器在后台会使用它。

   全局执行环境的变量对象是window,那么这个window对象就保存着全局变量和函数。

  每一个函数都有一个执行环境,可以理解为局部环境,但执行流到达函数时,环境会置于一个环境栈中,当执行完毕后,环境栈会把这个函数环境弹出,继续执行下一个环境。

  当一个环境遇到执行流时,会创建变量对象的一个作用域链,改作用域链的前端为当前的变量对象,如这个环境是函数,那么这个变量对象又称为活动对象,这个对象做开始只包含一个arguments变量。作用域链的下一个变量对象是包含环境,在下一个亦是上一个的包含环境,所以,作用域链的末尾的变量对象永远都是window(全局执行环境的变量对象),那么,内部环境可以通过作用域链访问外部环境,外部环境则不能。

  也就是说,var声明的变量会被自动添加到离他最近的环境中(向上),在函数内部,就是该函数的环境,在with中,也是相应的环境。

  那么,可以通过with或者try--catch来演唱作用域链,即在作用域链的前端增加一个变量对象。如下

  1. function a(){
  2. var a=true;
  3. with(location){
  4. var url=href+a;
  5. }
  6. return url;
  7. }
  8. a();

  需要注意一点,js没有块级作用域

  变量查询(查询标识符)当某个环境为了读取或者引用一个标识符时,就要进行检索过程,搜索过程从作用域链的前端开始,向上逐级查询,遇到匹配的就停止。

垃圾收集:js具有自动清除垃圾的能力,切这个功能是循环进行的(时间间隔),垃圾清理主要是为了减少内存的浪费,对不再使用的变量进行销毁,释放内存。

    1.标记清除法:js既然要自动清除垃圾,那么就要知道哪些是需要清理的,哪些是需要保留的,最简单的方法便是mark,当执行流执行到一个变量时,这个变量会被标记为“进入环境”,当执行结束后,便会被标记“离开环境”,当然标记的方法是多种多样的,可以是位翻转或者列表,这也是标记清除的思想。在标记清除中,垃圾收集器在运行时会对所有内存中的变量都加上标记,然后,他会去掉环境中的变量以及被环境中的变量引用的变量的标记,在此之后,在为这些变量添加标记,这些变量将被视为要删除的变量,最后完成内存清除操作。

    2.引用计数:跟踪记录每个值得引用次数,每被变量引用一次,就加1,若变量去了其他的值,就-1,直到为0,进行清除。这回倒着一个循环引用问题的出现,导致内存的浪费。

  

javaScript入门2--变量,作用域,内存的更多相关文章

  1. 3. Javascript学习笔记——变量、内存、作用域

    3. 变量.内存.作用域 3.1 基本类型和引用类型的值 ECMAScript 变量可能包含两种不同数据类型的值:基本类型值[Undefined.Null.Boolean.Number 和 Strin ...

  2. JavaScript基础——理解变量作用域

    一旦你开始在JavaScript应用程序中添加条件.函数和循环,就需要理解变量作用域.变量作用域规定了如何确定正在执行的代码行上的一个特定变量名的值. JavaScript允许你既定义全局版本又定义局 ...

  3. javascript中的变量作用域以及变量提升

    在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解. 变量作用域 “一个变量的作用域表示这个变量存在的上 ...

  4. javascript中的变量作用域以及变量提升详细介绍

    在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解变量作用域 “一个变量的作用域表示这个变量存在的上下文 ...

  5. 【JavaScript 从零开始】变量作用域

    变量作用域 一个变量的作用域(scope)是程序源代码中定义这个变量的区域. 全局变量拥有全局作用域,在JavaScript代码中的任何地方都是有定义的.然而在函数内声明的变量只是函数体内有定义. 他 ...

  6. JavaScript学习系列2一JavaScript中的变量作用域

    在写这篇文章之前,再次提醒一下 JavaScript 是大小写敏感的语言 // 'test', 'Test', 'TeSt' , 'TEST' 是4个不同的变量名 JavaScript中的变量,最重要 ...

  7. JavaScript中的变量在内存中的具体存储形式

    栈内存和堆内存 JavaScript中的变量分为基本类型和引用类型 基本类型是保存在栈内存中的简单数据段,它们的值都有固定的大小,保存在栈空间,通过按值访问 引用类型是保存在堆内存中的对象,值大小不固 ...

  8. 《JavaScript 高级程序设计》读书笔记四 变量 作用域 内存

    一   变量(基本类型和引用类型) a.基本类型保存值,保存在栈内存,引用类型保存指针,保存在堆内存: b.所有函数的参数都是按值进行传递的,不管参数是何种类型: c.检测类型 typeof     ...

  9. JavaScript要点 (一) 变量-作用域

    JavaScript 作用域 作用域—可访问变量的集合. 全局变量或者函数可以覆盖window对象的变量或者函数: 局部变量和window对象可以覆盖全局变量和函数. JavaScript 作用域 在 ...

  10. javascript中的变量作用域

    在网上看了一道js面试题 <script type="text/javascript"> var tt = 'aa'; function test() { alert( ...

随机推荐

  1. POJ3321 Apple Tree (树状数组)

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16180   Accepted: 4836 Descr ...

  2. 编译安装-MySQL5.5

    一.参数选项 1.目录选项 2.存储引擎选项 3.库文件加载选项 二.安装 1.环境准备 2.安装前的系统设置 3.安装执行 4.初始化数据库 5.注册为服务 6.加入环境变量 7.启动服务 8.重新 ...

  3. MD5加密类方法

    package com.shkj.android.utils; import java.security.MessageDigest;import java.security.NoSuchAlgori ...

  4. 后台动态设置前台标签内容和属性(转自http://www.wzsky.net/html/Program/net/26171.html)

    和以前的asp不同,在asp.net中为了彻底的代码分离,我们一般不采用<%=%>嵌入标签中来设置一些属性和内容.一般来说有2种情况:(一)设置标签的内容,比如<title>这 ...

  5. android UI开源库

    . ActionBarSherlock ActionBarSherlock是一个独立的Android设计库,可以让Android 2.x的系统也能使用ActionBar.此 外,ActionBarSh ...

  6. 索引的实现:B+树

    [ http://blog.csdn.net/stormbjm/article/details/12033673 ]   见<数据库系统概念>P323.   [从B树.B+树.B*树谈到R ...

  7. VC++中几种字符标志的解释

    VC++中几种字符标志的解释 LPSTR = char * LPCSTR = const char * LPWSTR = wchar_t * LPCWSTR = const wchar_t * LPO ...

  8. stl map高效遍历删除的方法 [转]

    for(:iter!=mapStudent.end():) {      if((iter->second)>=aa)      {          //满足删除条件,删除当前结点,并指 ...

  9. Beyond Compare3 添加到右键菜单

    Beyond Compare 是个优秀的工具,我们经常用于对比文件和文件夹,右键点点就可以调用对比,着实很方便.但从3.2版本之前,我们可以从设置中将bc关联到文件夹和文件右键,但之后的版本已经找不到 ...

  10. Codeforces Round #181 (Div. 2) B. Coach 带权并查集

    B. Coach 题目连接: http://www.codeforces.com/contest/300/problem/A Description A programming coach has n ...