《JavaScript高级程序设计》学习笔记(3)——变量、作用域和内存问题
欢迎关注本人的微信公众号“前端小填填”,专注前端技术的基础和项目开发的学习。
本节内容对应《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)——变量、作用域和内存问题的更多相关文章
- JavaScript高级程序设计学习(三)之变量、作用域和内存问题
这次讲的主要是变量,作用域和内存问题. 任何一门编程语言,都涉及这三个. 变量,比如全局变量,局部变量等,作用域,也分全局作用域和方法作用域,内存问题,在java中就涉及到一个垃圾回收的问题,由于ja ...
- JavaScript高级程序设计---学习笔记(一)
今天,2017.3.17开始利用课余时间仔细学习<JavaScript高级程序设计>,将需要掌握的知识点记录下来,争取把书里的所有代码敲一遍并掌握. 1.标识符命名最好是第一个字母小写,剩 ...
- javascript高级程序设计学习笔记
javascript高级程序设计,当枕头书已经好久了~zz 现在觉得自己在js的开发上遇到了一些瓶颈,归根究底还是基础太薄弱,所以重新刷一遍js高程希望有更新的认识. 一.javascript简介 ...
- JavaScript高级程序设计学习笔记--变量、作用域和内存问题
传递参数 function setName(obj){ obj.name="Nicholas"; obj=new object(); obj.name="Greg&quo ...
- 精读《javascript高级程序设计》笔记二——变量、作用域、内存以及引用类型
变量.作用域和内存问题 执行环境共有两种类型——全局和局部 作用域链会加长,有两种情况:try-catch语句的catch块,with语句. javascript没有块级作用域,即在if,for循环中 ...
- 《JavaScript高级程序设计》笔记:变量、作用域和内存问题(四)
基本类型和引用类型的值 ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段,而引用类型的值指那些可能有多个值构成的对象. 动态的属性 var p ...
- JavaScript高级程序设计学习笔记第四章--变量、作用域和内存问题
1.变量可能包含两种不同数据类型的值:基本类型值和引用类型值. 基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象. 2.变量复制 如果从一个变量向另一个变量复制基本类型的值,会在 ...
- javascript 高级程序设计 学习笔记
<!--<script> // 异步请求封装 IE6即以上浏览器 // ajax(url,fnSucc,selectID,fnFaild) //url 请求地址 //fnSucc 异 ...
- JavaScript高级程序设计学习笔记--BOM
window对象 BOM的核心对象是window,它表示浏览器的一个实例.在浏览器中,window对象有双重角色,它既是通过JavaScript访问浏览器窗口的一个接口,又是ECMScript规定的G ...
- JavaScript高级程序设计学习笔记--函数表达式
关于函数声明,它的一个重要特征就是函数声明提升,意思是在执行代码之间会读取函数声明,意思是在执行代码之前会先读取函数声明.这就意味着可以把函数声明放在调用它的语句 后面. sayHi(); funct ...
随机推荐
- 如何把一个用户加入sodu组
在一个命令前加sudo,可以使用超级用户的权限执行该命令.但并不是任何用户都可以使用sudo,只有用户属于sudo组时才能使用这个命令. 如 果希望把一个用户加入sudo组,可以用root登录系统,然 ...
- apache https 伪静态
今天很是郁闷,配置了一个https成功了,但是伪静态不成功,经过多方面查看资料终于配置成功了: <VirtualHost *:443> DocumentRoot /var/www/juba ...
- C++联合体(union)
C++的union本质上也是个类,跟struct性质几乎一致但是有一个最大的区别,数据共享内存 说到共享内存就要说下union的内存分配 union的大小是按照union里面的成员内存的最大值而分配的 ...
- System.DateUtils 3. IsPM、IsAM 判断是否为上、下午
编译版本:Delphi XE7 function IsPM(const AValue: TDateTime): Boolean; inline;function IsAM(const AValue: ...
- 转载:scala中:: , +:, :+, :::, ++的区别
原文链接:https://segmentfault.com/a/1190000005083578 初学Scala的人都会被Seq的各种操作符所confuse.下面简单列举一下各个Seq操作符的区别. ...
- About SSDT BI
Welcome to Microsoft Marketing Speak hell. With the 2012 release of SQL Server, the BIDS, Business I ...
- 《winform窗体应用程序》----------简易记事本
首先先给大家发表几张图片,描述一下记事本程序要实现的功能以及界面设计. 以上这些就是简易记事本的的主界面设计. 下面我们来做一些简单的讲解: 1.使用MenuStrip控件来实现菜单栏的基本设计. 在 ...
- nodejs单元测试
前言: 之前一直听说过单元测试,但是具体怎么做,也没有深入研究,感觉测试是一件很麻烦的事,花费时间.可能是自己太懒了,一看到测试那么多陌生的东西就不想弄了. 然后一拖再拖,直到最近,换了一家公司,然后 ...
- 【学】jQuery的源码思路4——增加一些功能
本文说一些简单的jQuery实现原理 eq() get() hide() show() index() find() //返回找到的一组元素中的第n个 zQuery.prototype.eq=func ...
- 快速开发一个PHP电影爬虫
今天来做一个PHP电影小爬虫.我们来利用simple_html_dom的采集数据实例,这是一个PHP的库,上手很容易.simple_html_dom 可以很好的帮助我们利用php解析html文档.通过 ...