中途才开始做笔记。。。。
3.10变量作用域
函数中的变量都在前面进行声明,却没有赋值。同时函数中变量在整个函数域都可用。这两点与C系列语言的块级有较大区别。
作为属性的变量,在添加var进行声明赋值时,表示不可被删除的全局变量,而直接使用变量名赋值,则会自动产生一个可以被删除的全局变量。
作用域链的概念了解部分,缺乏实际例子进行讲解。作为一个疑问在后面笔记进行补充。
4表达式与运算符
4.7左值
这是一个很古老的术语了,C系列中一直都有,在这里复习一下。左值的定义是,表达式只能出现在赋值操作符的左侧。
4.9表达式
===
如果两者类型不同,则不同。如果两者都是null或者undefined,都不同。如果两者都是TRUE或者false则相等。NaN甚至都不会等于他自身,对象都不会等于自身。引用来自同一地点相等。
==
两者类型不同时,也可能会判断相等,情况如下:当null与undefined时,相等。数字与字符串,在字符串转换成数值之后进行比较。对象的话转换成原始值进行比较。
例如:"i" == true;结果相等,因为字符成数字,true转换为数字。
4.13逗号运算符
先计算左边操作数,然后再进行右操作数。
5语句
5.3声明
变量和函数声明,加了var声明的变量声明被显示提前,而定义还在原地。而函数的话,函数名称和函数体都提前。
6对象
6.3删除属性
delete只是删除属性与寄主之间的联系。
a = {p:{x : 1}}; b = a.p; delete a.p;
但b.x依旧等于1,但是既然a中没有了p,为何b.x能连接到x?原因是因为删除的是a与p的联系,但是b是等于属性p的,所以其实b是通过p访问x。
7数组
7.1数组是一种特殊的对象,[]访问元素会将其中索引转换为字符串。
数组的索引与属性不同,当[]为非负整数时,为索引,其他情况为属性。数组没有越界的概念,只会返回undefined。
8函数
8.3方法调用
this是面对对象的核心,属于关键字,在嵌套函数中,如果嵌套函数被作为方法使用,this指向的是对象;如果作为函数使用,指向的不是全局this就是undefined。
8.4函数作为变量
其实函数名在js中就是一个变量名。可以赋给对象等等。。。。本质是一种特殊的对象,一切皆对象啊。
函数可以自定义函数属性,在函数中添加属性,保持不变。
8.5函数空间
作用和命名空间类似,只是将函数代替,用作命名空间,使用匿名函数。
8.6闭包
函数的执行依赖于变量的作用域,这个作用域是在函数定义的时候决定的,而不是在函数执行的时候决定。闭包的思想。
js实现的闭包和C语言实现的闭包不同。关系到CPU堆栈等实现。函数的作用链一般情况下在调用结束后会被释放,而包含嵌套函数的情况有点特殊,当嵌套函数没有被当做变量返回时,函数同样会被释放,因为没有引用。但如果嵌套函数被当做变量返回,外部就对嵌套函数的作用链引用,而嵌套函数作用链指向的变量绑定对象也不会被释放,所以函数也就不会被释放。感觉这样好绕啊,内存泄露会不会很恶心?
9类和模板
部分属性无法被继承,比如9-1例子中的两个属性就无法被继承。
9.2constructor属性
卧槽,没怎么看懂,留到后面。笔记还会不断补充。