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

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

<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
var x=1;
function a(o){
o=100;
alert(o);
}
a(x);
alert(x);
</script>
</body>
</html>

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

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

<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body> <script>
var obj={x:1};
function a(){
arguments[0].x=2;
} a(obj);
alert(obj.x);
</script>
</body> </html>

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

<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body> <script>
var obj={x:1};
function a(){
arguments[0]=2;
} a(obj);
alert(obj.x);
</script>
</body> </html>

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

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

<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body> <script>
alert( a);
var a=1;
</script>
</body> </html>

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

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

var a=1;
var b=a;

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

    按共享传递

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

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

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

作用域

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

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

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

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

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

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

function a(){
var a=true;
with(location){
var url=href+a;
}
return url;
}
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. 检测iOS的APP性能的一些方法

    首先如果遇到应用卡顿或者因为内存占用过多时一般使用Instruments里的来进行检测.但对于复杂情况可能就需要用到子线程监控主线程的方式来了,下面我对这些方法做些介绍: Time Profiler ...

  2. django admin site配置(二)

    1. ModelAdmin.inlines 将有外键的子类包含进视图 ,实例: class Author(models.Model): name = models.CharField(max_leng ...

  3. c++字符串机理

    在windows编程中,由于编码方式的不同和c与c++的不同而造成了许多复杂的有关字符串之间的转换 首先,windows编码方式有ANSCLL和UNICODE,前者是单字符的,后者是双字符的. 然后, ...

  4. java 对excel操作 读取、写入、修改数据;导出数据库数据到excel

    ============前提加入jar包jxl.jar========================= // 从数据库导出数据到excel public List<Xskh> outPu ...

  5. 把我的Java项目部署到Linux系统

    以前,还未毕业,凭借自己三脚猫的功夫,只会在Windows环境中使用tomcat容器把项目跑起来. 以前的操作是,利用Eclipse把项目导出成War包,放到tomcat的webApp文件夹中,鼠标点 ...

  6. OC中控制台日志打印

    OC中Debug版本常用的打印格式化操作   %@ 对象   %d,%i 整型 (%i的老写法)   %hd 短整型   %ld , %lld 长整型   %u 无符整型   %f 浮点型和doubl ...

  7. JobScheduler

    任务写在JobService中 public class TestJobService extends JobService { private static final String TAG = & ...

  8. 全代码实现ios-3

    决定做ios开发的时候,看了很多本关于ios开发的书籍,其中有国内的人写的,也有根据外国的书翻译过来的. 很可惜,这些书里的例子没办法照搬过来,因为Xcode更新换代太快了,而这些书本的内容更新的速度 ...

  9. TCommThread -- 在delphi线程中实现消息循环

    http://www.techques.com/question/1-4073197/How-do-I-send-and-handle-message-between-TService-parent- ...

  10. CSS布局经验谈

    1.盒子模型 CSS最具特色也是最本质的可以浓缩成盒子模型. 整个页面可以通过大盒子套小盒子,盒子挨着盒子放,摆成一个页面即可. 盒子即所谓的块元素,只有块元素才有宽和高,有了宽和高才能使盒子挨着盒子 ...