js004-变量、作用域和内存问题

4.1 基本类型和引用类型的值

基本类型:简单的数据段

引用类型:可能由多个值构成的对象

五种基本数据类型:undefined、null、boolean、Number、string。

这是按值访问的,因为可以操作保存在变量中的实际的值

引用类型的值是保存在内存中的对象,Javascript不允许直接访问内存中的位置,也就是说,不能直接操作对象的空间。在操作对象时,实际上是在才作对象的引用而不是实际的对象。

引用类型是按引用访问的

4.1.1 动态的属性

定义两种类型的方法类似:创建一个变量并为该变量赋值。

var person = new Object();

person.name = "meimei";

alert(person.name);

4.1.2 复制变量值

从一个变量向另一个变量复制基本类型值和引用之时,也存在差异。

复制基本类型值(在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上)

当一个变量向另一个变量复制引用类型值时,操作的实际上是一个指针,这个指针指向存储在堆中的一个对象

var num1 = 5;

var num2 = num1;

alert(num2);   //5

var obj1 = new Object();

var obj2 = obj1;

obj1.name = "meimei";

alert(obj2.name);  //"meimei"

4.1.3传递参数

ECMAScript中所有的函数的参数都是按值传递的。

访问变量可以按值或者按引用两种方式,但是参数只能按值传递

向参数传递引用类型值时:

参数是函数的局部变量。

使用对象来说明按值传递参数:

function addTen(num){

num += 10;

return num;

}

var account = 20;

var result = addTen(account);

alert(count);   //20

alert(result);   //30

function setName(obj){

obj.name = "meimei";

}

var person = new Object();

setName(person);

alert(person.name);   //"meimei"

对象是按值传递的:

function setName(obj){

obj.name = "meimei";

obj = new Object();

obj.name = "lal"

}

var person = new Object();

setName(person);

alert(person.name);   //"meimei"

当函数内部重写obj时,这个变量引用的就是一个局部对象了。这个对象在函数执行完后立即被销毁。

变量引用:案例1:

 

案例2:

案例三:

 

4.1.4 检测类型

typeof  用于基本数据类型的检测:

instanceof:

result = variable instanceof constructor

var s = "meimei";

var b = true;

var i = 22;

var u;

var n = null;

var o =new object;

alert(typeof s);    //string

alert(typeof b);    //number

alert(typeof i);    //boolean

alert(typeof u);    //undefined

alert(typeof n);    //object

alert(typeof o);    //object

alert(person instanceof Object);    //变量person是Objict对象吗

alert(colors instanceof Array);    //变量person是Array吗

alert(patttern instanceof RegExp);    //变量person是RegExp吗

在检测引用类型值的时候不大起作用

根据规定,所有引用类型的值都是Objict的实例,因此,在检测一个引用类型值和Object函数时,instanceof操作符始终会返回true。如果,使用instanceof操作符检测基本类型值,该操作符会始终返回false

4.2 执行环境及作用域

每个函数都有自己的执行环境

1、

var color = "blue";

function changecolor(){

if (color === "blue") {

color = "red";

}else{

color = "blue";

}

}

changecolor();

alert("color is now" + color);

2、

var color = "blue";

function changecolor(){

var anothercolor = "red";

function swapcolors(){

var tempcolor = anothercolor;

anothercolor = color;

color = tempcolor;

//这里可以访问 tempcolor  anothercolor color

}

swapcolors();

//这里可以访问  anothercolor color 但是不能访问tempcolor

}

changecolor();

//这里只能访问color

以上第二份代码变量的作用域链:

 

4.2.1 延长作用域链

当执行流进入下列任何一个语句时,作用域链就会得到加长:

try-catch 语句的catch块;

with块

这两个语句都会在作用域链的前端添加一个变量对象,with会将制定的对象添加到作用域链中。Catch 会创建一个新的变量对象,包含的是被抛出的错误对象的声明。例如:

function buildUrl(){

var qs = "?debug=true";

with(location){

var url = href + qs;

}

return url;

}

4.2.2 没有块级作用域

if

for

if (true) {

var color = "blue";

}

alert(color);

for (var i = 0; i < 10; i++) {

dosomething(i);  //举例子

};

alert(i);

对于有块级作用域的语言来说,for语句初始化变量的表达式所定义的变量只会存在循环环境中

4.2.2.1 声明变量

使用var声明的变量会自动被添加到最近的环境中。如果初始化变量时没有使用var声明,该变量就会被添加到全局环境中。

function add(num1 , num2){

var sum = num1 + num2;

return sum;

}

var result = add(20 , 30);

alert(sum);

function add(num1 , num2){

sum = num1 + num2;

return sum;

}

var result = add(20 , 30);

alert(sum);

 

4.2.2.2 查询标识符

var color = "blue";

function getcolor(){

return color;

}

alert(getcolor());   //blue

var color = "blue";

function getcolor(){

var color = "red";

return color;

}

alert(getcolor());  //red

4.3 垃圾收集

javaScript具有自动收集垃圾机制

4.3.1 清除标记  (最常用的垃圾收集方法)

4.3.2 引用计数

4.3.3 性能问题

4.3.4 管理内存

4.4 小结

javaScript变量可以保存两种类型的值:基本类型值和引用类型值。基本类型值源自于一下5种基本数据类型:Undefined、Null、Bollean、Number、String。基本类型值和引用类型值具有以下特点:

1、基本类型值在内存中占据固定大小的空间,所以被保存在栈内存中;

2、从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本;

3、引用类型的值是对象,保存在堆内存中;

4、包含引用类型值的变量实际上包含的并不是对象本身,复制的其实是指针,因此两个变量最终都指向同一个对象;

5、确定一个值是那种基本类型可以使用typeof操作符,确定一个值是那种引用各类型可以使用instanceof操作符;

所有变量(包括基本类型和引用各类型)都存在一个执行环境中(作用域)。这个执行环境决定了变量的生命周期,以及哪一部分代码可以访问其中的变量。下面是关于执行环境的总结:

1、执行环境有全局执行环境(全局环境)和函数执行环境之分;

2、每次进入一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链;

3、函数的局部环境不仅有权访问函数作用域中的变量,而且有权访问其父级远景,甚至全局环境;

4、全局环境只能访问在全局环境中定义的变量和函数,不能直接访问局部环境中的任何数据;

5、变量的执行环境有助于确定应该合适释放内存。

注:图片不能直接复制上来,回去再一张张上传吧。

版权声明:未经作者同意,不得私自转载。http://www.cnblogs.com/lal-fighting/

js004-变量、作用域和内存问题的更多相关文章

  1. 第一百零六节,JavaScript变量作用域及内存

    JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只 ...

  2. JavaScript变量作用域和内存问题(二)

    执行环境是js中特别重要的概念,是指变量或者函数可以访问其他数据,定义自己的行为.每个执行环境都有一个与之相对应的变量对象,执行环境中定义的所有变量和函数都保存在这个变量中,我们看不到这个变量,但是后 ...

  3. js 变量 作用域及内存

    由于Javascript是松散型的,所以其变量只是在特定时间用于保存特定值的一个名字而已,并不存在某个变量必须保存某种类型的值的规则,变量的值以及其数据类型都可以在脚本的声明周期内改变 一.基本类型与 ...

  4. 浅谈javascript中变量作用域和内存(1)

    先理解两个概念:基本类型和引用类型的值 1.基本类型和引用类型的值 (1)定义: 基本类型:指简单的数据段,比如按值访问的js五种基本数据类型undefined.null.boolean.number ...

  5. 浅谈javascript中变量作用域和内存(2)

    1.无块级作用域 javascript没有块级作用域,这会让其他程序员在理解js代码上很痛苦.在其他很多语言,比如C,大括号括起来的代码块都有自己的作用域 举个例子 if(true) { var na ...

  6. js基础之--变量 作用域和内存问题

    基本类型:Undefind Null Boolean Number String 引用类型: 对象 在操作对象时,实际上实在操作对象的引用而不是实际的对象.为此,引用类型的值是按引用访问的. 从一个变 ...

  7. 读书笔记 - js高级程序设计 - 第四章 变量 作用域 和 内存问题

      5种基本数据类型 可以直接对值操作 判断引用类型 var result = instanceof Array 执行环境 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这 ...

  8. javascript高级程序设计第3版——第4章 变量作用域以及内存

  9. js学习之变量、作用域和内存问题

    js学习之变量.作用域和内存问题 标签(空格分隔): javascript 变量 1.基本类型和引用类型: 基本类型值:Undefined, Null, Boolean, Number, String ...

  10. JavaScript 中变量、作用域和内存问题的学习

    这是我学习JavaScript的第二篇文章,之前做过几年的Java开发,发现JavaScript虽然也是面向对象的语言但是确实有很多不同之处.就本篇博客,主要学习总结一下最近学习到的JavaScrip ...

随机推荐

  1. 记一次使用命令行启动部署在tomcat上的应用

    在Eclipes进行程序开发完成后,一般都会直接在Eclipse部署启动,其中的一些启动参数设置都会在其中进行,若用命令行启动,则需要手动配置. 程序开发完成后打成的war包,需要部署到Tomcat应 ...

  2. mysql创建触发器

    触发器语句只有一句话 可以省略begin和end CREATE trigger `do_praise` after insert on praise for each row update post ...

  3. Oracle sql develpoer

    Oracle SQL Developer是针对Oracle数据库的交互式开发环境(IDE)     Oracle SQL Developer简化了Oracle数据库的开发和管理. SQL Develo ...

  4. 【JavaEE企业应用实战学习记录】requestListener

    package sanglp.servlet; import javax.servlet.*; import javax.servlet.annotation.WebListener; import ...

  5. ElasticSearch入门系列(三)文档,索引,搜索和聚合

    一.文档 在实际使用中的对象往往拥有复杂的数据结构 Elasticsearch是面向文档的,这意味着他可以存储整个对象或文档,然而他不仅仅是存储,还会索引每个文档的内容使之可以被搜索,在Elastic ...

  6. 42-stat 显示文件的信息

    显示文件的信息 stat [options] [file-list] 参数 file-list指定stat所显示的一个或多个文件的路径名 选项 -f                     显示文件系 ...

  7. C#开发命名规范

    学习C#之初,始终不知道怎么命名比较好,很多时候无从命名,终于有一天我整理了一份命名规范文档,自此我就是按照这个命名规范书写代码,整洁度无可言表,拙劣之处请大家斧正,愚某虚心接受,如有雷同,不胜荣幸 ...

  8. iOS开发--利用MPMoviePlayerViewController播放视频简单实现

    一.MPMoviePlayerViewController和MPMoviePlayerController区分开,前者继承自NSObject,后者继承自UIViewController 二.MPMov ...

  9. iOS不得姐项目--pop框架的初次使用

    一.pop和Core Animation的区别 1.Core Animation的动画只能添加到layer上 2.pop的动画能添加到任何对象 3.pop的底层并非基于Core Animation,是 ...

  10. 【Tyvj 1060】【NOIP 2005】等价表达式

    设a为一个质数,模数为另一个质数,然后暴力算多项式的答案,如果答案相等就认为两个多项式相等. 这种hash有出错概率的题为什么还是要用hash呢?因为出错的概率实在太小了,a和模数的值取得好出题人根本 ...