你的位置:首页 > 软件开发 > Java > JavaScript 高级程序设计(第3版)笔记——chapter4:变量、作用域和内存问题

JavaScript 高级程序设计(第3版)笔记——chapter4:变量、作用域和内存问题

发布时间:2016-03-14 00:00:13
Chapter4 变量、作用域和内存问题l 理解基本类型和引用类型的值l 理解执行环境l 理解垃圾收集 4.1基本类型和引用类型的值l ECMAScript变量包含两种不同数据类型的值:基本类型值和引用类型值。l 在将一个值赋给变量时,解析器必须 ...

Chapter4 变量、作用域和内存问题

l  理解基本类型和引用类型的值

l  理解执行环境

l  理解垃圾收集

 

4.1基本类型和引用类型的值

l  ECMAScript变量包含两种不同数据类型的值:基本类型值和引用类型值。

l  在将一个值赋给变量时,解析器必须确定这个值是基本类型值还是引用类型值

l  基本类型值:简单数据段

Undefiened,Null,Boolean,Number,String(按值访问)

l  引用类型值:可能由多个值构成的对象

Object(复制时:按引用访问;增加对象属性:操作实际对象)

 

4.1.1动态的属性

l  对于引用类型的值,可以添加属性和方法,也可以删除属性和方法

l  对于基本类型的值,无法给其添加属性和方法(虽然不会导致任何错误)

JavaScript 高级程序设计(第3版)笔记——chapter4:变量、作用域和内存问题

 

4.1.2复制变量值

l  基本类型值:创建新值,复制到为新变量分配的位置上

特点:副本,互不影响

复制前的变量对象

 

 

 

 

 

Num1

5

(Number 类型)

 

复制后的变量对象

 

 

Num2

5

(Number 类型)

Num1

5

(Number 类型)

l  引用类型值:创建新值,复制到为新变量分配的位置上

但是创建的新值实际上是一个指针,指向存储在堆中的一个对象

特点:两个变量将引用同一个对象,互相影响

 

复制前的变量对象

 

 

 

 

Obj1

 

(Object 类型)

 

复制后的变量对象 

JavaScript 高级程序设计(第3版)笔记——chapter4:变量、作用域和内存问题

 

4.1.3传递参数

l  访问变量:按值和按引用

函数参数传递:只有按值

  1. 向参数传递基本类型的值:被传递的值复制给一个局部变量(即命名参数,或者

       说arguments对象中的一个元素)

       JavaScript 高级程序设计(第3版)笔记——chapter4:变量、作用域和内存问题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" />

【在这个函数内部,obj和person引用的是同一个对象。换句话说,即使这个变量是按值传递的,obj也会按引用来访问一个对象。

如果person是按引用来传递的,那么person就会自动被修改为指向其name属性值为“Greg”的新对象。

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

 

4.1.4检测类型

l  检测基本类型(undefined,字符串,数字,布尔值):tpyeof

l  检测引用类型:instanceof

如果变量是给定引用类型(根据它的原型链来识别)的实例,instanceof操作符返回true

 

4.2执行环境及作用域

l  执行环境:定义了变量和函数有权访问的其他数据,决定了它们各自的行为。

1. 每个执行环境都有一个与之关联的变量对象

2. 全局执行环境是最外围的一个执行环境

(根据ECMAScript实现所在的宿主环境不同,表示执行环境的对象也不一样。在web浏览器中,全局执行环境被认为是window对象。所有的全局变量和函数都是作为window对象的属性和方法)

3. 每个函数都有自己的执行环境。

当执行流进入一个函数,函数的环境被推入一个环境栈中。而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境。

 

l  变量对象(variable object):保存执行环境中定义的所有变量和函数

 

l  作用域链(scope chain):保证对执行环境有权访问的所有变量和函数的有序访问

1. 当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的前端,都是当前执行代码所在环境的变量对象。

2. 作用域链中的下一个变量对象来自包含环境,而再下一个变量对象则来自下一个包含环境。这样,一直延续到全局执行环境;全局执行环境的变量对象始终都是作用域链中的最后一个对象。

 JavaScript 高级程序设计(第3版)笔记——chapter4:变量、作用域和内存问题

With语句的变量对象就包含了location对象的所有属性和方法

 

4.2.2没有块级作用域

l  类C语言中,有花括号封闭的代码块都有自己的作用域,因而支持根据条件来定义变量

l  对于JavaScript,没有块级作用域。

For语句初始化变量的表达式所定义的变量,if语句中的变量声明在执行结束后,也依旧会存在于对应的外部执行环境中。

 JavaScript 高级程序设计(第3版)笔记——chapter4:变量、作用域和内存问题domZWDat9q7SKO6cZkr6PrTs5FooPeflEFqOKOUHlWJNofxms9ZB7FmqVuRc0+mbNmof2u32bCzb9yVm7Vb7L2ZIH3E48fX2nL3bVetg6VYOVEuyOZYr543b/lAlnopDqCaUpnSGGDDrNspuf32pPineK8nu/dO9D9eNNYudY7eYPHdE2fJQ/6++bGmGLRv1CN6cLX3Wjes/y9d6zpatsOwB8V09uOWLeKwQP1hLo2Y3pUWPYAxb+6z4I/aNc73hdhM9tdM+zBD9Re32C+OR2X2gdoTdknazQ+0It7z2bsWQndb3RTS71dIQNeRaxb12wFtEpoS1J3AYtTT22IepXgNSoFUxHplDDtRkq7CMrL9g4+ip124irrGanWvvimPp+TRHUTrsZzcR7GaPbJ+ZnsPNazfjkdmRv/3wXrfbX+s5G/eh3rn2rjhWcx8292qtwx3sNmpmerrdEtdMdYxH5sADtXlk9mFJOPXazTJ0bWP1PJvvGrfLNUoz5wNmppYPbu8pgt12IWztph9RxhYxsqW/YgHlI5bh7KbQXzeFYt8/Q+zWkY99LF1MHatDGX/AIHbb46rCKGoJ77EPxUb9mmkI5Z3Oo4K3jxi29qfSMxtxv5zXf9Ze1+JY8jFmru8K43aJo4gJ6HGMZ7L7jsxmkO5uZ5lu1B0hYtjuqwpcM31Htr+6+5T9a38qPbPh9st53Vh7LcaxDFdLW8/K0mLJx/gdWXK234W77t+tJONw3qz2w5LJkH1Y7kBFXpRv+2I/wOBKBJk2Ts32fXiC3cLWbkOwFB1wPbJTY9itg7H7MNadItegOV2CSxLnLNi8jNqHi9dOUNu1a7dkPvEEF0P5fTgYGbIPOd0GALCNjx8/Zi2Xr90AYCyfP3+OWA6XdgMAcDGN3ajdAMDFNHYDAHAxjd3uU7tx5XQuuOK5HePPab1MY7d58arqbnaLtrHd31fEA+kkvLfU3t1u89Zuo+z2kBia6V7oqR6/IfoOjGm3uX7GMNZu3e6bxm7zMuroFe02heNC2a25A2Pu0mvbrRnt5eVFfKCTzjR2u0/t5ooT81DMiGM3i8ti7tLb2m0J1RFzGrtFRq+klsZmH2OcZuPGhI05N0OJG6XYxJKSJedaKD1JVz7iRjWfXNR8KlnZzfjk8ePRNy1TktLHuA+bdhNnr9PYLWbtVvsvb0gfcSzxU3Fyfkg22Wks43Y93iuvtkO257PHUydH2e2vyuPCg69Dmt4/AkSZnM5tt5g8d2jZ8lBLhrKlGTbZjnBjzt1b4f2UsjlbxhIHEnfL+s9aGqO+L/1p17VT4+LDtYc/MXy43fTHo1tammHLRmUnzG23gLWb62gxfrb5kZINW1AdzugXV+bdoxtjNrvt/X01nzLWvSiMq+eunLvai3cnTGO3gJxit7KlQ3CSJKPbrSNnYxqjvq+O82XYTX+3LGNd+2Eau1G7dcRRgntNYdmoviSNY3XkbExj1PcV2W6jZqZH2m37Ocdp7BaQvY+W7kZvzhZTWDaqL8nusVyjpJUl9cbuTejQFnZT3r2R3cLWbl4viC1i5GajmIDSbg9iNI5xuyxq8I7lHcU4lrFFDKufaBdhHdJah+YFBIs6p7FbTB4VvH3EsB1jZT3tCYs5W1pc+YwdSxylHL0vjmW7so/scUeI0u2s4/aYdUj77Ja1T2O3gLXbE8sxYD9O1v31IEocbzJlZ0uLa7uUnn1j1TooOYihvNkq/buVxDqkabPdxPZp7HYr7AcqROB03VyA7VPvie0WtnYbgqV4gTiI31fEAykwY9chnXtmem2KWRdqCw3f13ZGnUlUfso6jd2uXbslw8kgCAXf13aGrEOqFH3T2A0AwEVQuwEAAAAAAAAAAMBxcJUKAK4Jl+EB4MogOAC4LNgNAK4JdgOAa4LdAOCaYDcAuCZcWACAy8LdIQBwTbAbAFwQpAYA1wS7AcA1wW4AcE2wGwBcE+wGANcEuwHABeFGEAC4Go/3nJ0OAMAg8BoAAADADPxp4OwcAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4B3/B0xtmKNzqaWHAAAAAElFTkSuQmCC" />

函数执行完后,objA和objB将继续存在,因为它们的引用次数永远不会是0

l  IE9之前BOM和DOM对象使用C++以COM(组件对象模型)对象的形式实现。

所以即使IE的JavaScript引擎使用标记清除策略来实现,JavaScript访问的COM对象却是基于引用计数策略。存在循环引用问题。

 JavaScript 高级程序设计(第3版)笔记——chapter4:变量、作用域和内存问题

例子中的DOM从页面中移除,它也永远不会被回收。

IE9把BOM和DOM对象都转换成了真正的JavaScript对象。避免了两种垃圾收集算法并存导致的问题,也消除了常见的内存泄漏现象。

 

4.3.3性能问题

垃圾收集器是周期性运行的,垃圾收集的时间间隔是一个非常重要的问题

IE7之前的垃圾收集器根据内存分配量运行的,具有严重的性能问题。

 

4.3.4管理内存

l  出于安全方面的考虑,为防止运行JavaScript的网页耗尽全部系统内存而导致系统奔溃,分配给web浏览器的可用内存数量通常比分配给桌面应用程序的少

l  确保占用最少的内存可以让页面获得更好的性能——为执行中的代码只保存必要的数据。不必要的通过解除引用(dereferencing),将其值设置为null.

    局部变量会在它们离开执行环境时被自动解除引用,全局变量和全局变量的属性需要手动解除引用。

l  解除一个值的引用并不意味着自动回收该值所占用的内存。解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。

 


 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:JavaScript 高级程序设计(第3版)笔记——chapter4:变量、作用域和内存问题

关键词:JavaScript

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。