<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>变量、作用域和垃圾回收</title> </head> <body> <div id="box"></div> <script> //一、变量:存数据的,数据分为数值类型和引用类型 //1.数值类型:number,string,boolean,undefined,null //复制的是实际的值 var num1 = 5; var num2 = num1; num1 = 6; console.log(num2);//5 //2.引用类型:object和symbel //复制的实际上是一个指针,指向同一个对象 var obj1 = new Object(); obj2 = obj1; obj1.name = "王二小"; console.log(obj2.name);//王二小 //检测类型:typeof检测基本类型,instanceof检测引用类型 var s = "王二小"; console.log(typeof s);//string var obj = new Object(); console.log(obj instanceof Object);//true //二、作用域:全局作用域和局部作用域 //1.全局执行环境被认为是window对象。所有全局变量和函数都是作为window对象的属性和方法创建的。 //全局执行环境直到应用程序退出例如关闭网页偶浏览器时才会被销毁。 //2.局部作用域:函数的作用域链包含两个对象:它自己的变量对象和全局环境的变量对象 //局部作用域:当前函数-》父函数-》全局环境 var color = "blue"; function changeColor () { var anotherColor = "red"; function swapColors () { var tempColor = anotherColor; anotherColor = color; color = tempColor; //这里可以访问tempColor,anotherColor,color } //这里可以访问anotherColor,color,但不能访问tempColor swapColors(); } changeColor(); //注:内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境的任何变量和函数。 //三、内存:作用域有助于确定何时释放内存 //离开作用域的值将被自动标记为可以回收,因此将在垃圾收集期间被删除 //垃圾收集:标记清除和引用计数; //1.标记清除是目前主流的垃圾收集算法,当变量进入环境时,就将这个变量标记为“进入环境”,当变量离开环境时,则将其标记为“离开环境” //2.引用计数:跟踪记录所有值被引用的次数。当引用次数为0时,垃圾收集器下次再运行时就会释放其内存 //3.为了确保有效地回收内存,应该及时解除不再使用的全局对象、全局对象属性以及循环引用的变量的引用。将其值设为null var element = document.getElementById("box"); var myObject = new Object(); myObject.element = element; element.someObject = myObject; myObject.element = null; element.someObject = null; </script> </body> </html>