`
bird12010
  • 浏览: 7482 次
  • 性别: 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权威指南 学习笔记之变量作用域分享

    //声明,并且赋值,即定义了 下面是几点总结: 变量的作用域:全局的和局部的。(注意:如果尝试读取一个未声明的变量的值,javascript会生成一个错误) 第一点:在都使用var关键字修饰变量的情况下,如果给一个局部...

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

    使用var 定义变量:定义该变量的作用域的局部变量,这种定义变量的方法也被成为显式声明。 这么说不理解的话可以看看下面这个简单粗暴的例子: 代码如下: test(); function test(){ var firstDemo=”hello”;//定义...

    JavaScript高级程序设计学习笔记(二)

    最近花了一天看完了第四章(变量、作用域和内存问题)和第五章(引用类型),然后隔天就被同学拉去干活了,身心俱疲。 先把第四章的笔记总结一下,怕回头忘光了哈哈。以下的笔记是书上一些我以前学习的时候,没有太...

    Javascript学习笔记二 之 变量

    一.关于Javascript变量声明 在Javascript中,声明一个变量 var a=1; 也可以直接 a=1; 这两种表达是有区别的, 一个是当前作用域的局部变量,另一个则是当前作用域的全局变量;... // error 二.Javascript变量作用域

    Javascript学习笔记3 作用域

    在Javascript,全局环境本身就一个对象。... 言归正传,当我们写下:var i=1时,其实就是声明了一个window作用域的一个变量。 而当我们写下i=1时,是声明了一个window的属性。 看这样一段代码: [Ctrl+A 全选 注:

    JavaScript高级整理

    谷粒学院学习笔记,内容包括 原型与原型链、执行上下文、执行上下文栈、变量提升、函数提升、作用域、作用域链、闭包、对象的多种创建模式、对象的继承模式、JavaScript事件循环机制等。

    浅析JavaScript中的变量复制、参数传递和作用域链

    今天学习笔记主要有这样几个关键字:变量、参数传递、执行环境、变量对象、作用域链。  1.变量  变量需要注意的有两点:变量声明和复制变量值。  变量声明肯定大家都很熟悉,在JS中我们都是通过 var 关键字...

    JavaScript高级程序设计(第3版)学习笔记8 js函数(中)

    6、执行环境和作用域 (1)执行环境(execution context):所有的JavaScript代码都运行在一个执行环境中,当控制权转移至JavaScript的可执行代码时,就进入了一个执行环境。活动的执行环境从逻辑上形成了一个栈,...

    JavaScript高级程序设计(第3版)学习笔记7 js函数(上)

    2、变量的数据类型:就是指变量可以存储的值的数据类型,比如Number类型、Boolean类型、Object类型等,在ECMAScript中,变量的数据类型是动态的,可以在运行时改变变量的数据类型。 3、变量类型:是指变量本身的...

    Javascript学习笔记之函数篇(六) : 作用域与命名空间

    在之前的介绍中,我们已经知道 Javascript 没有块级作用,只有函数级作用域。 代码如下: function test() { // a scope  for(var i = 0; i &lt; 10; i++) { // not a scope  // count  }  console.log(i); // ...

    面向对象javascript笔记

    面向对象的 javascript 学习 大家好,根据我的学习...引用,函数重载和类型检查,作用域,图解prototype和constructor, 闭包,上下文,公共方法和私有方法,公共变量私有变量,特权方法,静态方法,命名空间,编码建议

    javascript从入门到跑路—–小文的js学习笔记(7)——–js函数

    含义: 一般来说一段程序代码中使用的变量和函数并不总是可用的,限定其可用性的范围即作用域,作用域的使用可以提高程序逻辑的局部性,增强程序的可靠性,减少名字冲突。 分类: 全局作用域: 在当前文件中的所有...

    javascript学习笔记(十三) js闭包介绍(转)

    一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。 代码如下: var n=999;...

    JS页面获取 session 值,作用域和闭包学习笔记

    本文实例讲述了JS页面获取 session 值,作用域和闭包。分享给大家供大家参考,具体如下: Javascript获取session的值: var name= "${sessioScope.变量名}"; 注意这里面需要使用 “” 把 El 表达式给括起来,否则...

    JavaScript闭包原理与用法学习笔记

    词法作用域: 看下面的一个例子: function init() { var name = 'GaoPian'; // name是局部变量 function displayName() { //displayName();是内部函数,一个闭包 alert&#40;name&#41;; // 使用外部函数声明...

    JavaScript 语言精粹学习笔记第1/2页

    JavaScript的函数是基于词法作用域的顶级对象。Javascript是第一个成为主流的Lambda语言。相对于Java而言,JavaScript于Lisp和Scheme有更多的共同点。它是披着C外衣的Lisp。这使得JavaScript成为一个非常强大的语言...

    谈一谈javascript闭包

    要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。  var n=999;  function f1(){  ...

    my_demos:深入前端核心理论,记录个人博客

    7 章:函数表达式《JavaScript 高级程序设计(第四版)》学习笔记:第 3 章:语言基础第 4 章:变量、作用域与内存第 6 章:集合引用类型6.4 Map6.5 WeakMap6.6 Set6.7 WeakSet第 7 章:迭代器和生成器7.2 迭代器...

Global site tag (gtag.js) - Google Analytics