javascript征途笔记
基础
1、 只有函数有作用域
2、 如果在<script src>的src 中设置了src特性,则script元素包含的任意代码就无效了。应该分开放到不同的script块中。
3、 外部js脚本文件和页面内嵌的js代码的执行顺序是按它们在文档中的位置决定的,而不是先执行内嵌脚本,后执行外部脚本文件。
4、 建议通过外部文件形式导入js文件。
5、 使用接口技术解决js文件函数重名的冲突。问题是如果封装的接口也冲突了怎么办?定义接口的对象名也不能够相同,否则也会冲突。P46 这个例子没运行起来。
6、 Js为css设置样式,是以html文件为参考的,而不用考虑js文件的具体位置,而css文件是以它本身位置为参考的。
7、 浏览器是从上到下解析网页源码的。
8、 接口的概念?
9、 使用变量之前必须先声明。尽量少使用全局变量。
10、 怎么区分构造函数、类和一般的函数?在命名时构造函数和类名建议首字母大写,而函数小写开头
11、 使用alert和confirm进行手动调试
第四章 数据类型和变量
1、 实词和虚词。实词指标识符、关键字保留字、直接量等。虚词指空白符、换行符、注释等无意义的字符。实词是区分大小写的。
2、 Js只有三种数据类型:数值型(不区分浮点和整数,都是浮点型)、字符串型和数组型。null、undefined,number,string,Boolean是五种原始数据类型。
object
function是对象。是object的特殊情况。
棧存储值类型,堆存储引用类型。
3、 alert(Boolean(1));//返回的是true。书上返回的是13。有误
alert((a = 1,2,3,4));//4
alert(a=(1,2,3,4));//4
alert(Boolean(1));//true
a = 1,2,3,4;
alert(a);//1
var a = 1,2,3,4;
alert(a);//null
4、 JS仅支持定义一维数组。不支持多维数组。但是可以模拟多维数组。但是性能不好。
Var a = [[1,2,3],[4,5,6]];。数组可以放入不同的任意类型的数据,包括function和表达式。
5、 函数在js中是第一种类型(基类,父类),其他类型继承于function。Object也是由Function来实现的。这点很NB啊。
6、 函数如果没有返回值,责约定返回值是undefined。
7、 函数是一个独立的作用域,只能通过函数返回值读取函数内部的数据。而构造函数是可以通过this.属性,获取函数内部的属性值。构造函数是定义对象的模板,就是类。
8、 函数解析的机制:js解释器在预编译时就会把所有function语句声明的函数处理,如果存在同名函数,则后面的函数体会覆盖前面的函数体。而js解释器只是对var语句声明的变量名进行索引,变量的初始化值却被忽略,直到执行期才去为变量读取初始值。而对于function声明的函数体,js解释器不仅对函数盟按变量标识符进行索引,而且对于函数体也提前处理。
第一:JavaScript时按<script></script>编译,并执行的。
第二:JavaScript编译时完成对变量的声明,及函数处理。
第三:JavaScript后声明的函数将会覆盖前声明的函数
9、 处于同一个文档中的js教本,都属于同一个作用域:window。可以互相通信和调用。
10、 Constructor属性。表示构造函数的属性值,用来检测数据类型。(10).constructor。返回number。
Js习惯:先声明后读写,先赋值后运算。
变量的作用域:
1、 局部变量都比全局变量的优先权高
2、 内部局部变量比外层局部变量优先权高
3、 变量都是对象的属性。全局变量是window对象的属性。
第五章
Delete
如果删除内部对象的预定义成员和客户端对象成员,使用var语句申明的变量也是不允许删除的。
可以删除不存在的变量,返回true。
Delete操作是彻底删除所占用的存储空间。
Void运算符的优先级、void的运算结果返回undefined。
第七章
函数的作用域。
function和Function构造函数的作用域是不同的。Funtion有顶级作用域。而function是局部的。
函数的解析机制
Js解释器是一段段分析和执行程序的。在同一段代码中,function语句和函数直接量定义的函数结构总会被提取出来执行。只有当函数被解析和执行完毕之后,才会按顺序执行其它代码。但是Function构造函数定义的函数并非提前运行,而是在运行时动态地被执行。
函数的接收值个数没有限制。函数的返回值只能有一个。若要返回多个数据,则用数组存储。
函数的生命周期:
使用function语句声明的函数被预先编译,此时如果存在相同的函数名,则会按顺序覆盖。而函数直接量和构造函数定义的函数都属于表达式函数,因此在代码按行执行时,才被激活生命周期。
函数的形参通过length属性来获取。
Arguments对象。参数管理器
Arguments.length表示实参的个数。Arguments不是array对象,而是object对象,不能用for/in结构遍历。
可以通过arguments[i]下标动态改变实参的值。也可以通过修改length动态增大或减小实参的个数。
Arguments.Callee可以返回当前arugments对象所属的函数的引用,等价于函数名。Arguments.Callee.length表示函数形参的个数。
This关键字
Undefined+undefined=NaN。多个undefined相加会返回NaN。
函数作用域和实例化函数this的作用域是不同的。实例化只值向当前函数的作用域,而函数调用对象的作用域则是window。
函数属性的作用域:
函数体外定于的属性可以任意的访问,可以在函数体内或外部访问,而函数内部定义的属性在初始化状态只能在函数体内部被调用。但若函数被调用后,则可以在外部访问函数内部定义的属性。若属性是函数,作用域也是一样的。
Call和apply。Apply传递的是数组。
1、 Call和apply将函数转换成方法传递给某个对象,只是临时的,函数最终没有作为对象的方法存在,当函数被调用后,该对象方法会自动被注销。
2、 Call和apply避免了资源浪费。
闭包:数据存储的一种方式。在动态环境中,数据实时变化,为了避免前面的数据丢失,js提供了闭包来寄存动态数据。
特性:
自闭特性。外界无法访问闭包结构内部的数据。
包裹特性。
第八章
定义抽象对象的方法是通过构造函数来实现的。
Push()会添加新元素后返回数组长度。
创建对象时,存储在变量中的只是引用指针,并不是对象本身。删除变量后,对象本身依然存在。
Js的垃圾回收机制,自动收集无用存储单元,不需要专门销毁无用对象以释放内存。当对象没有被任何变量引用时,js会自动侦测并把所有废除的对象注销。
当我们把对象的所有引用变量都设置为null时,可以强制对象处于废除状态。并被回收。
当删除对象属性后,不是将属性设为undefined,而是真正从内存清除掉。
对象的作用域:
Js仅支持一种作用域,即公共作用域。对于js所有对象的所有属性和方法来说都是公开的。
Js对象的结构封闭性不如函数结构。函数有自己的私有作用域。外界是无法访问的。
通过命名规则以区分私有作用域。O.x._a_=1;
静态对象:static 声明。Math和Global都是静态对象。
Js不支持静态作用域。
构造对象:就是构造函数。如Object、Date、Function。构造对象的首字母要大写。
构造对象不能直接被引用。必须使用new来实例化。
alert(Point.name); //直接读取构造对象的属性
alert(p1.name); //但是不能够通过实例对象来读取构造对象的属性 返回 undefined。这个name是构造对象在函数外定义的。如果是在函数内定义的则可以访问。
对于构造对象的属性,实例对象