JS_ 垃圾回收、变量与属性、作用域链

1.垃圾回收

js的垃圾回收机制不同于java,c等语言需要手工回收,js中的垃圾回收是自动启动的,大致过程:js解释器会判断一个对象是否是可达的,即是否有变量指向它,没有,则启动回收机制,释放该对象占用的内存,eg:

1 var s = "hello world";
2 var s2 = s.toUpperCase();//创建新字符串:"HELLO WORLD"
3 s2 = s;//"hello world"没有变量指向,占用内存被释放

这样,写js代码时就没有后顾之忧了,即使定义了很多垃圾对象,js解释器也会自动回收,保证内存的高效利用

2.变量与属性

观念的转变:js中变量就是属性

①全局对象 当js解释器未执行任何代码前,先会创建全局对象:global object,可以用this 或者 window获取对该全局对象的引用,该对象的n多个属性指向了n个变量或者方法,如 this.parseInt();指向方法,this.Infinity指向了一个无穷大的变量,当我们定义一个全局变量时,改变量默认就是全局对象的一个属性

②局部对象 function内部定义的变量,即局部变量,实际为局部对象call object的属性,同上,该对象的属性也会指向n个变量(局部)甚至内部嵌套function的引用

3.作用域链--scope chain

首先提到一个概念,执行上下文,即js执行脚本的执行环境,不属于任何function的js代码在一个全局执行上下文中执行,该环境下是全局对象 global object;function 内部的代码在局部的执行上下文下执行,该环境下有局部对象 call object

js中,执行上下文是与作用域链相关的,作用域链(scope chain)是一系列的对象,比如,js中要访问某个变量的值,那就去访问其作用域链的对象的属性,来看是否有与该变量一致的属性,具体流程是这样的,如下代码:

1 var x = 1;
2 function test1() {
3     var y = 2;
4     function test3() {
5         var z = 3;
6     }
7 }

全局变量x的执行上下文关联的scope chain 的对象仅为global object,访问x,则去访问全局对象是否有x属性,有,返回其值,没有,返回undefined;

局部变量y 的执行上下文关联的scopechain 的对象则有两个:其本身所在function的局部对象(call object),上一层的global object,访问y ,先看局部对象call object是否有该属性,有,返回值2,如果没有再访问全局对象,全局对象再没有该属性,返回undefined;

对于局部变量z,同理,其所在执行上下文的作用域链由三个对象组成,本身function所包含的call object,上层的call object,外层的global object ,访问其值时,遍历对象属性的过程同上,不再赘述。

今天学的这些东西,比较偏理论,但感觉有学到了很多新东西,希望对诸位有帮助

读《JavaScript---The Definitive Guide》总结笔记

时间: 2024-10-05 04:58:25

JS_ 垃圾回收、变量与属性、作用域链的相关文章

执行环境、变量对象和作用域链

执行环境又称执行上下文,英文缩写是EC(Execution Context),每当执行流转到可执行代码时,即会进入一个执行环境.在JavaScript中,执行环境分三种: 全局执行环境 — 这个是最外围的代码执行环境,一旦代码被载入,引擎最先进入的就是这个环境.在浏览器中,全局环境就是window对象,一次所有全局属性和函数都是作为window对象的属性和方法创建的.全局执行环境直到应用程序退出时才会被销毁. 函数执行环境 — 当执行一个函数时,JavaScript引擎进入执行环境.某个执行环境

变量对象、作用域链和This

变量对象 作用域链 This 整理自:https://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html 系列文章中变量对象,作用域链和this三篇文章 原文地址:https://www.cnblogs.com/shaunyang/p/10348640.html

javascript 执行环境,变量对象,作用域链

前言 这几天在看<javascript高级程序设计>,看到执行环境和作用域链的时候,就有些模糊了.书中还是讲的不够具体. 通过上网查资料,特来总结,以备回顾和修正. 要讲的依次为: EC(执行环境或者执行上下文,Execution Context) ECS(执行环境栈Execution Context Stack) VO(变量对象,Variable Object)|AO(活动对象,Active Object) scope chain(作用域链)和[[scope]]属性 EC 每当控制器到达EC

使用变量对象引出作用域链

<script type="text/javascript"> var name="xm"; //全局变量,window.name===name; 返回:true function fn(){ //全局变--方法 , window.fn()====fn(); 返回:true var name="xh"; //局部变量 , 可以理解为fn().name===name.(本来是看不到的,为了好理解,虚拟为一个实例)  var sex=&q

闭包,作用域链,垃圾回收,内存泄露

关于闭包,我翻了几遍书,看了几遍视频,查了一些资料,可是还是迷迷糊糊的,干脆自己动手来个总结吧 !欢迎指正... (- o -)~zZ 1. 什么是闭包? 来看一些关于闭包的定义: 闭包是指有权访问另一个函数作用域中变量的函数 --<JS高级程序设计第三版> p178 函数对象可以通过作用域链相关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性称为 ‘闭包’ . --<JS权威指南> p183 内部函数可以访问定义它们的外部函数的参数和变量(除了this和argument

JS闭包、作用域链、垃圾回收、内存泄露相关知识小结

补充: 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包的三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数和变量不会被垃圾回收机制回收 闭包的定义及其优缺点: 闭包 是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量 闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露. 闭包是javascript语言的一大

*JS:执行环境、变量对象、活动对象和作用域链

var a=1; function b(x){ var c=2; console.log(x); } b(3); ·执行环境(execution context),也称为环境.执行上下文.上下文环境.执行上下文环境: 每次当控制器转到ECMAScript可执行代码的时候,即会进入到一个执行上下文.执行上下文(简称-EC)是ECMA-262标准里的一个抽象概念,用于同可执行代码(executable code)概念进行区分. 通俗的话来讲就是,JS中的函数运行不能仅仅看函数内部有哪些变量,再简单的

JavaScript中的变量、参数、作用域和作用域链

基本类型和引用类型 在JavaScript中有两种数据类型值.基本类型值和引用类型值.基本类型值指的是简单的数据段,而引用类型值指的是可能由多个值构成的对象.在JavaScript中有5种基本数据类型,分别是:Undefined.Null.Boolean.Number.String(这个和其他编程语言不一样,需要注意).基本数据类型是按值进行访问的,一般都存储在栈中.而引用类型的值都保存在内存堆上面,在内存栈上保存一个对它的引用(这个和C#,Java等编程语言存储对象的方式类似).在JavaSc

作用域链、变量对象、闭包

变量对象: 摘自汤姆大叔的博客:http://www.cnblogs.com/TomXu/archive/2012/01/16/2309728.html 1.变量对象(variable object) 是与执行上下文相关的 数据作用域(scope of data) . 它是与上下文关联的特殊对象,用于存储被定义在上下文中的 变量(variables) . 函数声明(function declarations) 和 函数的形参 . 2.就像我们所说的, VO就是执行上下文的属性(property)