欢迎关注本人的微信公众号“前端小填填”,专注前端技术的基础和项目开发的学习。

本节内容对应《JavaScript高级程序设计》的第四章内容。

1、函数:通过函数可以封装任意多条语句,而且可以在任何地方、任何时候调用执行。ECMAScript中的函数用function关键字来进行声明,后面跟一组参数以及函数体。不必指定是否有返回值

 function functionName(args0,args1,...argsN){
      //statements
 }

2、函数的重载:为一个函数编写两个定义,只要这两个定义的签名(接受的参数的类型和数量)不同即可。ECMAScript函数没有签名,因为其参数是由包含零个或多个值得数组来表示的,而没有函数签名,真正的重载是不可能做到的。如果在ECMAScript中定义两个名字相同的函数(函数名和参数的个数均相同),则该名字只属于后定义的函数。

function add(num){
     return num + 100 ;
}

function add(num){
     return num + 200 ;
}

3、JavaScript变量松散类型的本质决定了它至少在特定时间用于保存特定值的一个名字而已,由于不存在定义某个变量必须保存何种数据类型值得规则,变量的值及其数据类型可以在脚本的生面周期内改变。

4、ECMAScript变量包含两种不同的数据类型:基本类型值和引用类型值。基本类型值指的是简单的数据段,引用类型值指那些可能由多个值构成的对象。注意:在JavaScript中字符串是基本类型,是按值访问的,这一点与java中的不一样。对于引用类型的值(即对象),我们可以动态地为其添加属性和方法:

var person = new Object() ;
person.name = "Jack" ;  //添加属性name

5、变量值的复制:

  • 对于简单类型值:复制前后的两个变量没有任何关系,某一个变量的改变并不影响另一个变量的值
  • 而对于引用类型值:复制的内容实际上是一个指针,指向该对象的存储地址,所以复制前后的两个变量实际上指向同一个对象,某一个变量的值的改变会影响另一个变量的值。

6、ECMAScript中所有函数的参数都是按值传递的,即将函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样,应用类型的复制实际上是对象的存储地址的复制。

7、前面提到检测变量的数据类型用typeof,但是typeof的返回值只有string、number、boolean、undefined、function(函数和正则表达式均返回function)、object(null和引用类型均返回object)。所以,对于引用类型或null,我们无法具体确定是属于哪一种引用类型的对象。要确定属于哪一种引用类型,我们可以用instanceof操作符,如果变量是给定引用类型的对象,则instanceof操作符将返回true。因此,在检测一个引用类型值和object构造函数时,始终会返回true,而如果使用instanceof操作符检测基本类型的值,则该操作符始终会返回false,因为基本类型不是对象。

8、在javascript中,执行环境定义了变量或函数有权访问的其他数据类型,决定了他们各自的行为。每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中

  • 根据ECMAScript实现所在的宿主环境不同,表示执行环境的对象也不一样。
  • 某个执行环境中的所有代码执行完毕后,该环境就被销毁,保存在其中的所有变量和函数定义也随之销毁。
  • 全局执行环境是最外围的一个执行环境。在web浏览器中,全局执行环境被认为是window对象,因此所有全局变量和函数都是作为window对象的属性和方法创建的。
  • 每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。而在函数执行完毕后,栈将其环境弹出,把控制权返回给之前的执行环境。
  • 当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)。作用域链的作用是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端始终都是当前执行的代码所在环境的变量对象。作用域链的下一个变量对象来自包含环境,再下一个变量对象则来自下一个包含环境。这样一直延续到全局执行环境,全局执行环境的变量对象始终是作用域链中的最后一个对象。
  • 标识符的解析是沿着作用域链一级一级地搜索标识符的过程。搜索过程始终从作用域链的前段开始,然后逐级地向后回溯,直至找到标识符为止(如果找不到标识符,通常会导致错误发生)。
  • 当执行流进入到try-catch语句的catch语句或者with语句中时,作用域链就会得到延长。
  • javascript中没有块级作用域
    if(true){
        var color = "blue" ;
    }
    
    alert(color) ;  //在java中,存在块级作用域,此时在if外面用到color变量则是不合规范的,但是在javascript中不存在这种问题

9、垃圾收集:javascript具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中是用得内存。这样,在编写javascript程序时,我们不需要关心内存使用问题,所需内存分配以及无用内存的回收完全实现了自动管理。则也解决了C++/C语言存在的很大一部分问题。对于垃圾收集,通常用到两种策略来判断一个变量是否是垃圾:

  • 标记清除(mark-and-sweep):当变量进入环境时,就将该变量标记为进入环境,当变量离开环境时,标记为离开环境。
  • 引用计数(reference counting):一个变量被引用(赋值给另一个变量)一次则应用数加1,相反,如果包含该对象应用的变量又取得了另外一个值,则减1。当一个变量计数为0时,表示该变量不再需要,可以清除了。注意循环引用的情况会导致变量无法被清除。

10、确保占用最少的内存可以让页面获得更好的性能。而优化内存占用的最佳方式,就是为执行中的代码只保存必要的数据。一旦数据不再用,最好通过将其值设置为null来释放其引用(这个方法叫解除引用)。

《JavaScript高级程序设计》学习笔记(3)——变量、作用域和内存问题的更多相关文章

  1. JavaScript高级程序设计学习(三)之变量、作用域和内存问题

    这次讲的主要是变量,作用域和内存问题. 任何一门编程语言,都涉及这三个. 变量,比如全局变量,局部变量等,作用域,也分全局作用域和方法作用域,内存问题,在java中就涉及到一个垃圾回收的问题,由于ja ...

  2. JavaScript高级程序设计---学习笔记(一)

    今天,2017.3.17开始利用课余时间仔细学习<JavaScript高级程序设计>,将需要掌握的知识点记录下来,争取把书里的所有代码敲一遍并掌握. 1.标识符命名最好是第一个字母小写,剩 ...

  3. javascript高级程序设计学习笔记

    javascript高级程序设计,当枕头书已经好久了~zz  现在觉得自己在js的开发上遇到了一些瓶颈,归根究底还是基础太薄弱,所以重新刷一遍js高程希望有更新的认识. 一.javascript简介 ...

  4. JavaScript高级程序设计学习笔记--变量、作用域和内存问题

    传递参数 function setName(obj){ obj.name="Nicholas"; obj=new object(); obj.name="Greg&quo ...

  5. 精读《javascript高级程序设计》笔记二——变量、作用域、内存以及引用类型

    变量.作用域和内存问题 执行环境共有两种类型——全局和局部 作用域链会加长,有两种情况:try-catch语句的catch块,with语句. javascript没有块级作用域,即在if,for循环中 ...

  6. 《JavaScript高级程序设计》笔记:变量、作用域和内存问题(四)

    基本类型和引用类型的值 ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段,而引用类型的值指那些可能有多个值构成的对象. 动态的属性 var p ...

  7. JavaScript高级程序设计学习笔记第四章--变量、作用域和内存问题

    1.变量可能包含两种不同数据类型的值:基本类型值和引用类型值. 基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象. 2.变量复制 如果从一个变量向另一个变量复制基本类型的值,会在 ...

  8. javascript 高级程序设计 学习笔记

    <!--<script> // 异步请求封装 IE6即以上浏览器 // ajax(url,fnSucc,selectID,fnFaild) //url 请求地址 //fnSucc 异 ...

  9. JavaScript高级程序设计学习笔记--BOM

    window对象 BOM的核心对象是window,它表示浏览器的一个实例.在浏览器中,window对象有双重角色,它既是通过JavaScript访问浏览器窗口的一个接口,又是ECMScript规定的G ...

  10. JavaScript高级程序设计学习笔记--函数表达式

    关于函数声明,它的一个重要特征就是函数声明提升,意思是在执行代码之间会读取函数声明,意思是在执行代码之前会先读取函数声明.这就意味着可以把函数声明放在调用它的语句 后面. sayHi(); funct ...

随机推荐

  1. springMvc3.0.5搭建全程 (转)

    用了大半年的Spring MVC3.0,用着感觉不错.简单写一个搭建Spring MVC3.0的流程(以Spring3.0.5为列),数据库交互使用spring JDBC Template,附件有项目 ...

  2. SQL Server 中存储过程的练习

    建库建表建约束 插入数据 --建库建表建约束和插入测试数据 use bankDB go --1.完成存款,取款业务--存款 create proc usp_takeMoney ),),)=null,@ ...

  3. VS2008编译bat

    工程文件为AirCode,批处理文件为bulit.bat(与*.sln文件在同级目录). 以下是批处理的代码: echo %~dp0 rem set build_config="Debug| ...

  4. Razor 视图引擎 – ASP.NET MVC 4 系列

           Razor 视图引擎是 ASP.NET MVC 3 开始扩展的内容,并且也是默认视图引擎.        Razor 通过理解标记的结构来实现代码和标记之间尽可能顺畅的转换.下面的例子演 ...

  5. 在CentOS上安装并运行SparkR

    环境配置—— 操作系统:CentOS 6.5 JDK版本:1.7.0_67 Hadoop集群版本:CDH 5.3.0 安装过程—— 1.安装R yum install -y R 2.安装curl-de ...

  6. 在工作有时候centos6.5系统使用rpm包安装mysql5.7出现的问题

    首先说明一下,我用的CentOS版本是6.6,64位.打印机驱动程序是两个rpm安装包:cndrvcups-common-2.60-1.x86_64.rpm和cndrvcups-capt-2.60-1 ...

  7. RAID简介

    RAID(独立磁盘冗余阵列)可以提供较普通磁盘更高的速度,安全性,所以服务器在安装时会选择创建RAID.RAID的创建有两种方式:软RAID(通过操作系统软件来实现)和硬raid(使用硬件整列卡) r ...

  8. 数据库schema设计与优化

    原文地址 1. 前言 对于数据库而言,在日常开发中我们主要的关注点有两块,一个是schema的结构设计,另一个就是索引的优化,这两块是影响我们最终系统结构和性能的关键部分,自然也是我们花费精力最多的部 ...

  9. STM32串口

    状态寄存器USART_SR的复位值为0x00C0H:即 第七位发送寄存器空TXE=1和第六位发送完成TC=1寄存器为空, TC=1表明发送已完成.此时只要使能了发送空和发送完成中断就可进入中断ISR( ...

  10. class中new与未new的区别 类对象占用空间--转载

    转载自http://blog.sina.com.cn/shuiwuhendeboke    颗颗的博客 (1)作用域不同 不用new:作用域限制在定义类对象的方法中,当方法结束时,类对象也被系统释放了 ...