《JavaScript语言精髓与编程实践》读书笔记二
第3章非函数式语言特性
这一章首先介绍了语言的分类,命令式(结构化编程,面向对象编程),说明式(函数式等)。而这一章,主要介绍JS的非函数式特点。
在开始之前,首先介绍了由“结构化编程”向“面向对象编程”的演化趋势。“结构化编程”根本上是面向机器世界的“存储描述”因此抽象层次比较低,所以带了以下几点问题:
1. 结构体与实体直接相关,并且将这种相关性直接呈现在使用者的面前,因此开发人员必须面临数据的具体含义与关系。
2. 结构体的抽象更面向于数据存储形式的表达和算法实现方式,脱离了使用环境,算法的结构也缺乏通用性。
3. 僵化的类型与讲话的逻辑并存,影响了业务逻辑的表达。
以上三点,在面向对象编程之中得到了良好的解决。
1. 面向对象提出通过更加细化的可见设定(public,protected,private等),更好地实现了数据的封装以及数据域的管理。
2. 面向对象中的“继承”解决了结构体的通用性问题。可以在不同的场合从共有的特点中继承产生新的类别,从而更好地适应该场合。
3. “多态”被用来解决了“强类型”与业务逻辑表达之间的冲突。
此外,接口的提出(质保陆数据提的逻辑行为能力,而不暴露这种能力的实现方法和给予的数据特性),是一种更高层次的抽象。
之后就是重点讲js的“结构化编程”和“面向对象编程”的具体内容。
首先说结构化的内容:
1. break/break<label>的区别:break 表示跳出当前循环,break<label>表示跳出当前label之间的语句。
变量的作用域:
1. JS中,表达式级别的变量都是匿名的。
2. 由于JS中不存在语句级别的变量作用域,因此for ( var i in obj)中的i会逸出到上一级,很有可能造成污染!
3. JS中变脸的作用域只有两个局部变量(函数内部),全局变量。
4. 两个不利于开发的事情:
1) 在全局范围内任意声明变量,尤其是在for语句中声明变量
2) 在函数内部不适用var声明变量,而是直接为变量赋值将会导致变量逸出到全局
5. JS中,语法解释与执行分为两个阶段,变脸的显示声明(var)是在语法解释阶段处理的(在解释阶段该值为undefine)。
6. 变量的被创建的两个方式:
1) 在语法分析时,发现了显示声明的变量var
2) 在代码执行时,发现试图为一个未被创建的变量赋值
7. 变量的两种释放方式:
1) 某个函数退出时,清除函数内的未被引用的变量
2) 全局代码块终结时,将清除全局的变量和数据的引用
8. 一个具名函数完全等价于将一个匿名函数赋值给一个已经声明变量的表示符的。
var sb = function() { alert("haha"); } function sb2() { alert("haha"); }
这两个函数除了在语法上面有些不同之外,调用方式等都是一样的。
面向对象,内容比较多,下一篇再细说吧!