《JavaScript高级程序设计》读书笔记【二】

变量,作用域和内存问题

  传递参数

function setName(obj){

obj.name="Nicholas"
obj =new Object();
obj.name="Greg"

}

var person =new Object();

setName(person);
alert(person.name)    //"Nicholas"
View Code

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

 

  检测类型

//基础类型检测
var s="Nicholas";
var b=true;
var i=22;
var u;
var n=null;
var o=new Object();

alert(typeof s);    // string
alert(typeof i);    //number
alert(tyoeof b);    //boolean
alert(typeof u);    //undefined
alert(typeof n);    //object
alert(typeof o);    //object

//引用类型检测

result = variable instanceof constructor

alert(person instanceof object);    //变量person是Object吗?
alert(colors  instanceof Array);    //变量colors是Array吗?
alert(pattern instanceof RegExp)    //pattern是RegExp吗?
View Code

  所以引用类型都是Object的实例,使用typeof 操作符检测函数时,返回"function".

 

  执行环境及作用域

var color="blue";

function changeColor(){
   var anotherColor="red"

    function swapColors(){
        var tempColor=anotherColor;
        anotherColor=color;
        
    //这里可以访问 color,anotherColor,tempColor
    }
    //这里可以访问color,anotherColor,不能访问tempColor
    swapColors();
}    
    //只能访问 color
changeColor();
View Code

  

  延长作用域链

  •   try-catch语句的catch块
  •   with语句
    function buildUrl(){
      var qs="?debug=true";

      with(location){
           var url=herf+qs

         }
         return url;

    }
View Code

  没有块级作用域

  小结

  JavaScript变量可以用来保存两种类型的值:基本类型值和引用类型值。基本类型值源自于:Undefined,Null,Boolean,Number和String五种基本数据类型。基本类型值和引用类型值具有一下特点:

  •   基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中;
  •   从一个变量向另一个变量复制基础类型的值,会创建这个值的一个副本;
  •   引用类型的值是对象,保存在堆内存中;  
  •   包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针;
  •   从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象;
  •   确定一个值是哪种基本类型可以使用typeof操作符,而确定一个值是哪种引用类型可以使用instanceof操作符。

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

  •   执行环境分为全局执行环境(全局环境)和函数执行环境(局部环境);
  •   每次进入一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链;  
  •   函数的局部环境不仅有权访问函数作用域中的变量,而且有权访问其包含(父)环境,乃至全局环境;
  •   全局环境只能访问在全局环境中定义的变量和函数,不能直接访问局部环境中的任何数据;
  •   变量的执行环境有助于确定应该何时释放内存;

  JavaScript是一门具有自动垃圾收集机制的编程语言,开发人员不必关心内存分配和回收问题。解除变量的引用不仅有助于消除循环引用现象,而且对垃圾收集也有好处,为了确保有效地回收内存,应该及时解除不在使用的全局对象、全局对象属性以及循环引用变量的引用;

    function createPerson(name){
    var localPerson=new Object();
    localPerson.name=name;
    return localPerson;

}

var globalPerson=createPerson("Nicholas")

 //手动解除globlaPerson的引用
globalPerson=null;
View Code

 

  

posted @ 2018-03-13 22:17  Jewin  阅读(95)  评论(0)    收藏  举报