学习第一天(2019-11-14)
第一章 JavaScript简介
1、 JavaScript与ECMAScript的关系:早期,Netscape Navigator和微软(微软的为JScript)都有其各自的JavaScript实现,这意味着有两个不同的JavaScript版本,随着业界担心的日益加剧,JavaScript的标准化被提上议事日程。欧洲计算机协会制造商(ECMA)召集各公司优秀程序员,制定了DCMA-262——名为ECMAScript的新脚本语言标准。
2、JavaScript的实现
由下列三个部分组成:
a:核心(ECMAScript)
b:文档对象模型(DOM)
c:浏览器对象模型(BOM)
JavaScript的这三个组成部分,在当前五个主要浏览器(IE、Firfox、Chrome、Safari和Opera)中都得到了不同程度的支持。其中所有浏览器对ECMAScript第3版的支持大体上都还不错,而对ECMAScript5的支持程度越来越高,但对DOM的支持则彼此相差比较多。对已经正式纳入HTML5标准的BOM来说,尽管各浏览器都实现了某些众所周知的共同特性,但其他t特性还是会因浏览器而异。
第二章 在HTML中使用JavaScript
1、把JavaScript插入到HTML页面中要使用<script>元素。使用这个元素可以把JavaScript嵌入到HTML中(方法一),还可以包含外部的JavaScript文件。
2、在包含外部的JavaScript文件,src指向文件的URL,可以是同一个服务器的文件,也可以是外域的文件。
3、传统的做法一般把所有<script>元素都放在页面的<head>元素中,对于需要很多的JavaScript代码的页面来说,可能会导致页面出现延迟,为了避免这个问题,现代的 web应用程序,一般都把全部JavaScript引用放在<body>元素中页面的后面,如下:
<html> <head> ...... </head>
<body> HTML代码 JavaScript代码<script type = "text/javascript" src="example.js"></script>...
</body> </html>
4、defer属性和async属性,可控制脚本的显示时机。
第三章 基本概念
本章介绍JavaScript基本语法,由于比较简单,下面列出一些不熟悉的和易错点:
1、ECMAScript的变量是松散类型的,可以保存任何类型的数据(Undefined、Null、Boolean、Number、String、Object),每个变量仅仅是一个占位符而已。
2、typeof操作符可检测变量的数据基本类型,instanceof可检测引用类型。
3、JavaScript浮点类型,采用IEEE754标志,有一个通病会产生误差,所以永远不要测试某个浮点数的数值,如 var a =0.1; var b=0.3; a+b==0.3结果为false。
4、with语句是将代码作用域设置到一个特定的对象中。大量使用with语句会降低性能,开发中不建议使用。
5、函数可以有返回值也可以没有,建议有返回值时保持函数一直有,没有时保持函数一直没有,便于维护。函数的参数在内部是用一个数组来表示的(arguments,可通 过数组下标访问),所以命名参数只是提供便利,不是必须的,所以函数没有传统意义上的重载。
第四章 变量、作用域和内存问题
1、基本类型和引用类型的值:
基本类型的赋值是按值传递,被赋值的变量会重新开辟一个新的内存空间,在把值写进去,而对引用进行赋值,虽然会重写开辟内存空间,但只把引用的地址复制了 一遍,两个变量指向内存中的同一个对象。
2、传递参数:按值传递,基本数据类型,把值复制个参数,形参的改变对实参无影响,引用传递把引用的值复制给形参,实参和形参指向同一个对象。
3、作用域:JavaScript没用块级作用域,for(var i=0;i<10; i++); 即使在for循环执行结束,变量i也依旧会存在于循环外部的执行环境中。
JavaScript中没用块级作用域,是函数作用域,这点很重要。
执行环境是JavaScript中一个重要概念,它定义了变量或函数有权访问的其他数据,决定了它们各自的行为。每个执行环境都有一个与之相关的变量对象,执行环境中定义的所有变量和函数都保存在这个对象中(虽然我们无法访问这个对象,但解析器后台处理数据时可以使用它)。
全局执行环境是最外围的一个执行环境。每个函数都有自己的执行环境,当执行流进入一个函数时,函数的执行环境就会被推入一个环境栈中,函数执行完弹出,把控制权返回给之前的执行环境。
当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,始终都是当前执行的代码所在环境的变量对象。如果这个环境是函数,则将其活动对象(activation object)作为变量对象。活动对象在最开始时只包含一个变量,即arguments 对象(这个对象在全局环境中是不存在的)。作用域链中的下一个变量对象来自包含(外部)环境,而再下一个变量对象则来自下一个包含环境。这样,一直延续到全局执行环境,全局执行环境的变量对象始终都是作用域链中的最后一个对象。
代码示例:
1 var color = "blue"; 2 3 function changeColor(){ 4 var anotherColor = "red"; 5 6 function swapColors(){ 7 var tempColor = anotherColor; 8 anotherColor = color; 9 color = tempColor; // 这里可以访问 color、anotherColor 和 tempColor 10 } 11 12 // 这里可以访问color和anotherColor,但不能访问tempColor 13 swapColors(); 14 } 15 16 // 这里只能访问 color、changeColor();
以上代码共涉及 3 个执行环境:全局环境、changeColor()的局部环境和 swapColors()的局部环境。全局环境中有一个变量 color 和一个函数 changeColor()。changeColor()的局部环境中有 一个名为 anotherColor 的变量和一个名为 swapColors()的函数,但它也可以访问全局环境中的变量 color。swapColors()的局部环境中有一个变量 tempColor,该变量只能在这个环境中访问到。 无论全局环境还是 changeColor()的局部环境都无权访问 tempColor。然而,在swapColors()内部则可以访问其他两个环境中的所有变量,因为那两个环境是它的父执行环境(我的理解只能往上访问--父执行环境,不能往下访问)。下图形象地展示了这个例子的作用域链。

从这里可以看出JavaScript中没有块级作用域,只有函数作用域。
4、查询标识符会从作用域的前端开始,向上逐级查询与给定的名字匹配的标识符。
5、垃圾收集(一般有两种方法):标记清除法(现在各浏览器基本使用此方法)、引用计数法(存在循环引用的问题,现在基本不采用)。
6、程序员可通过解除引用来管理内存(让垃圾收集器自动回收)。
浙公网安备 33010602011771号