`
bird12010
  • 浏览: 8049 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

《javascript高级程序设计2》学习笔记4变量、作用域和内存问题

阅读更多

 

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

1)基本类型值

保存在内存中的简单数据段。

5种基本数据类型:Undefined, Null,Boolean,Number和String,在内存中分别占有固定大小的空间,一般称它们按值访问。

2)引用类型值

保存在内存中的对象。意思是变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,该位置保存对象。

这 种类型大小不固定,不能保存在栈内存当中,但是内存地址的大小是固定的,我们可以存储在栈内存当中。当查询引用类型的变量时,就首先从栈中读取内存地址, 然后“顺杆爬”地找到保存在堆中的值。这种方式称为按“引用”访问,因为我们操作的不是实际值,而是被那个值所引用的对象。

4.1.1动态属性

不能给基本类型的值添加属性,只能给引用类型动态的添加属性。

var person = new Object();
person.name = “flyer”;
alert(person.name);

var name =“flyer”;
name.age = 27;
alert(name.age);//undefined

 

4.1.2复制变量值

 

1)基本类型值

 

从一个变量向另一个变量复制基本类型值时,会在栈中创建一个新值,然后把该值复制到为新变量分配的位置上。两个变量不会相互影响。


2)引用类型值


当从一个变量向另一个变量复制引用类型值时,同样会在栈中放一新的变量进去,不同的是这个新值实际上是一个指针,指向存储在堆中的一个对象。复制操作结束后,两个变量实际上引用同一对象。因此,改变一个,会影响另外一个。

 

4.1.3传递参数


参数只能按值传递,参数实际上是一局部变量。


4.1.4检测类型


基本数据类型用typeof

引用类型用instanceof


4.2 执行环境及作用域


当引用类型复制时,同样会在栈中放一新的变量进去,不同的是这个新值实际上是一个指针,它指向存储在堆中的一个对象。复制操作结束后,两个变量实际上引用同一对象。因此,改变一个,会影响另外一个

当 代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)。作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,始终都是当前执行的代码所在环境的变量对象。如果这 个环境是函数,则将其活动对象(activation object)作为变量对象。活动对象在最开始时只包含一个对象,即arguments(这个对象在全局环境中是不存在的)。作用域链的下一个变量对象来 自包含(外部)环境,而再下一个变量对象则来自下一个包含环境。这样一直延续到全局执行环境;全局执行环境的变量对象始终都是作用域中的最后一个对象。

标识符解析是沿着作用域链一级一级地搜索标识符过程。搜索过程始终从作用域链的前端开始,然后逐级向后回溯,直至找到标识符为止(如果找不到标识符,则会发生错误)

每个环境都可以向上搜索作用域链,以查询变量和函数名;但任何变量都不能通过向下搜索作用域链而进入另一个执行环境。

 

 var color = “blue”;
       
        function changeColor(){
            var anotherColor = “red”;
       
            function swapColors(){
                var tempColor = anotherColor;
                anotherColor = color;
                color = tempColor;
               
                //这里可以访问color, anotherColor和 tempColor
            }
       
            //这里可以访问color和anotherColor,但不能访问tempColor       
            swapColors();
        }
       
        changeColor();

        //这里不能访问anotherColor and tempColore, 但能访问color
        alert(“现在的颜色为” + color);//red

 

4.2.1 延长作用域链    

 

     try-catch语句的catch
         with语句

对catch语句来说,其变量对象中包含的是被抛出的错误对象的声明

 

function buildUrl() {
            var qs = "?debug=true";
        
            with(location){
                var url = href + qs;        
            }
        
            return url;
        }

        var result = buildUrl();
        alert(result);

 

 

4.2.2 没有块级作用域

 

for(var i=0;i<10;i++){
      doSomething(i)
}

alert(i); //  10

在JavaScript中,由for语句创建的变量i 即使在for循环结束后,也依旧会存在于循环外部的执行环境中

 

4.3 垃圾收集

4.3.1标记清除

JavaScript 中最常用的是垃圾收集方式是标记清除( mark-and-sweep )。当变量进入环境时,就将这个变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会 用到它们。而当变量离开环境时,则将其标记为“离开环境”。

 

4.3.2引用计数

跟踪记录每个值被引用的次数,次数为0时释放所占用的内存。

 

4.3.3性能问题

在ie 中调用者window.CollectGarbage() 方法执行垃圾收集。

在Opera 7+ 中,调用window.opera.collect()启动垃圾收集例程

 

4.3.4管理内存

一旦数据不再有用,就将其值设置为null来释放其引用—这个做法叫“解除引用”,适用于大多数全局变量和全局对象的属性。局部变量会在它们离开执行环境时自动被解除引用。

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

 

 

 

分享到:
评论

相关推荐

    JavaScript高级程序设计2,学习笔记---第一篇

    这篇学习笔记将带你探索JavaScript的核心概念,包括变量、数据类型、控制流、函数、对象和类等,这些都是构建复杂应用程序的基础。 首先,我们要了解JavaScript的基础语法。在JavaScript中,变量是存储数据的容器,...

    javascript权威指南 学习笔记之变量作用域分享

    在《JavaScript权威指南》第五版中,对变量作用域进行了深入的介绍,通过对作者的学习笔记梳理,我们可以系统地了解变量作用域相关的知识点。 首先,我们需要明确变量作用域的两个基本类型:全局作用域和局部作用域...

    毕设&课设&项目&实训-基于JavaScript高级程序设计第四版的学习笔记.zip

    这本“JavaScript高级程序设计第四版”的学习笔记涵盖了JavaScript的各个方面,旨在帮助学生、开发者以及对编程感兴趣的人深入理解这一强大的脚本语言。这份笔记是针对毕设、课设、项目实训等实践性学习场景编写的,...

    Javascript高级程序设计---笔记.pdf

    以上只是JavaScript高级程序设计中的一部分内容,实际的学习笔记会更深入地探讨这些主题,包括异常处理、作用域链、闭包、异步编程(如回调函数、Promise、async/await)、模块系统(CommonJS、ES modules)、正则...

    javascript高级编程(学习笔记 包括 1 , 2 版)

    JavaScript 高级编程的学习笔记涵盖了ECMAScript中的基础概念,特别是关于变量、数据类型和运算符的使用。在ECMAScript中,变量可以存储两种基本类型的值:原始值(Primitive Values)和引用值(Reference Values)...

    JavaScript 学习笔记之变量及其作用域

    在作用域分析的例子中,我们看到了变量作用域的另一个有趣方面。看下面这个例子: ```javascript var i = 0; // 定义全局变量i function test() { demoFunction(i); function innerFunction() { i = 1; // 局部...

    javascript学习笔记发放2

    在这篇学习笔记中,我们将深入探讨JavaScript中的数据操作和函数作用域。 首先,我们要明白JavaScript中的数据类型分为基本数据类型(如Number、String、Boolean、Null、Undefined和Symbol)和对象数据类型(如...

    javascript入门学习笔记

    这些只是JavaScript学习笔记的一部分,深入理解并熟练运用这些概念,将为JavaScript编程打下坚实的基础。随着学习的深入,还会接触到更多高级特性和框架,如闭包、原型链、AJAX、jQuery、Vue.js、React.js等,这些都...

    JavaScript学习笔记

    JavaScript学习笔记主要涵盖了这门广泛应用于网页和网络应用开发的脚本语言的核心概念和技术。这篇笔记基于Jerry Zhang在iteye博客上分享的文章,旨在帮助读者深入理解和掌握JavaScript的基础及高级特性。 1. **...

    JavaScript-学习笔记.pdf

    以上是JavaScript学习笔记中提到的一些核心知识点,通过对这些知识点的理解和熟练应用,可以为进一步学习和掌握JavaScript打下坚实的基础。在实际开发过程中,结合具体的项目需求,这些知识会得到更深入的拓展和应用...

    JavaScript练习程序学习笔记.rar

    这份“JavaScript练习程序学习笔记”很可能包含了一系列的代码示例、学习心得和常见问题解答,旨在帮助学习者深入理解和掌握JavaScript编程。 在JavaScript的学习过程中,首先会接触到基础语法,包括变量声明(var...

    js 笔记 javascript 学习笔记

    本学习笔记将深入探讨JavaScript的核心概念,包括变量、数据类型、操作符、控制流程、函数、对象、数组、原型链、闭包等,并结合实际示例,如my.js、order.js、login.js等文件,来讲解其在实际项目中的应用。...

    javascript学习笔记整理知识点整理

    这份“javascript学习笔记整理知识点整理”是针对初学者的一份宝贵资料,涵盖了JavaScript的基础知识,旨在帮助新手快速入门并掌握这门语言的核心概念。 一、变量与数据类型 在JavaScript中,变量用于存储数据。...

    Javascript学习笔记(传智播客视频学习笔记+代码)

    "Javascript学习笔记(传智播客视频学习笔记+代码)"是一份全面介绍JavaScript基础知识的学习资源,适用于初学者。这份笔记结合了传智播客的web前端培训视频内容,提供了丰富的理论讲解和实践代码,帮助读者从零开始...

    JavaScript 入门 新手学习笔记

    8. **闭包**:理解闭包的概念及其在内存管理、模块化和函数作用域中的应用,是进阶学习的重要部分。 9. **面向对象编程**:JS支持基于原型的面向对象,包括构造函数、原型链、继承等概念。 10. **JavaScript框架和...

    JavaScript-学习笔记.docx

    JavaScript是一种广泛应用...以上就是JavaScript学习笔记中的主要知识点,理解和掌握这些内容对于深入学习JavaScript至关重要。在实际编程中,还需要结合具体的场景灵活运用,并不断实践和探索更高级的特性和最佳实践。

Global site tag (gtag.js) - Google Analytics