zoukankan      html  css  js  c++  java
  • js004-变量、作用域和内存问题

    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/

  • 相关阅读:
    oo第三单元学习总结
    oo第二单元学习总结
    OO第四单元UML作业总结兼OO课程总结
    OO第三单元JML作业总结
    OO第二单元电梯作业总结
    OO第一单元总结
    OOUnit4Summary
    OOUnit3Summary
    OOUnit2Summary
    OOUnit1Summary
  • 原文地址:https://www.cnblogs.com/lal-fighting/p/5142144.html
Copyright © 2011-2022 走看看