zoukankan      html  css  js  c++  java
  • 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》总结笔记

  • 相关阅读:
    nltk的使用
    TF-IDF原理及使用
    Python Join
    pandas 常用清洗数据(三)排序,去重
    pandas 常用清洗数据(二)
    pandas 常用清洗数据(一)
    Python 测试
    【Python学习之三】流程控制语句
    【Python学习之二】Python基础语法
    【Python学习之一】Python安装、IDE安装配置
  • 原文地址:https://www.cnblogs.com/baweier2013/p/5107751.html
Copyright © 2011-2022 走看看