《JavaScript高级程序设计》读书笔记【二】
变量,作用域和内存问题
传递参数
function setName(obj){ obj.name="Nicholas" obj =new Object(); obj.name="Greg" } var person =new Object(); setName(person); alert(person.name) //"Nicholas"
当在函数内部重写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吗?
所以引用类型都是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();
延长作用域链
- try-catch语句的catch块
- with语句
function buildUrl(){ var qs="?debug=true"; with(location){ var url=herf+qs } return url; }
没有块级作用域
小结
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;

浙公网安备 33010602011771号