第2章 语法
2.1 空白
避免使用 /* */注释,可能与正则表达式冲突
/* var rm_a = /a*/.match(s) ; */
2.5 语句
一个编译单元包含一组可执行的语句。在web浏览器中,每个<script>标签都提供一个被编译且立即执行的编译单元。因为缺少链接器,JavaScript把他们一起抛入一个公共的全局名字空间中。
不像其他语言,JavaScript中的代码块(一对花括号中的一组语句)不会创建一个新的作用域。
第3章 对象
JavaScript的简单类型包括数字、字符串、布尔值、null、undefined。其他所有的值都是对象(python是万物皆对象),包括函数、数组、正则表达式。
对象是属性的容器,每个属性都有名字和值。
注意了!尿点来了,JavaScript中的对象是无类别的(class-free),我的理解就是js里没有class的概念而只有对象。
对象(a)可以继承其他对象(b)的属性值,b就叫做a的原型,通过多次的继承可以形成一条继承链(类似python class继承链)。对象字面量最根部的原型是Object.prototype,函数对象最根部原型是Function.prototype(其实它也一样继承自Object.prototype)
3.7 枚举
for in 语句遍历对象的属性,其遍历顺序是不确定的,如果想要以确定顺序遍历对象请使用数组,用下标来遍历。
3.9 减少全局污染
全局变量减弱了程序的灵活性,作者推荐的方法是,只创建一个全局变量,作为名字空间使用。类似XXXX项目 每个脚本函数都以"x888888"开头,以清晰分辨其所在模块。
var MYAPP = {} MYAPP.a = { "name" : "kelvin" "make" : "love" }
第4章 函数
4.3 调用
除了声明时定义的形式参数,调用一个函数还会给它附加两个参数:this,arguments。arguments是调用函数时传递给函数的参数列表,包括那些声明时没有定义形式参数的多于参数。
函数调用有四种模式,每种模式this的值是不同的。
- 方法调用模式
- 函数调用模式
- 构造器调用模式
- Apply调用模式
var person = { name : "kelvin",sex : "man",say : function(str){ document.write(str); } }; person.say("nihao"); //方法调用,this是Person var Add = function (a, b){ return a + b; }; var result = Add(1, 2); //函数调用模式,this被绑定到全局对象 var Person = function (name, sex){ this.name = name; this.sex = sex;
}; var kk = new Person("kelvin", "man"); //构造器调用模式,重点说一下,使用new关键字时,将创建一个新对象kk,kk的原型就是Person的prototype。this绑定kk。 person.say.apply(null, "hello"); //apply调用模式,this是由apply的第一个参数所指定的
4.5 返回
函数执行完毕时或遇到return语句时返回到调用函数的地方,返回值是 return 后的值,如果没有return语句则返回undefined。
如果函数调用前使用了 new 关键字,则
- 没有return语句或return值不是一个对象,返回this,也就是新创建的对象
- 如果有return语句且返回的是一个对象,那返回值就是这个对象
4.9 作用域
JavaScript有函数作用域,定义在函数内部的变量和参数对于函数外部是不可见的,而且在函数中任何地方定义的变量在该函数的任何地方都可见。
最好的做法是在函数体的顶部声明函数可能用到的所有变量。
4.10 闭包
第5章 继承
附录C:JSlint
JSlint 是一个JavaScript验证工具(非开源),可以扫描JavaScript源代码来查找问题。如果JSLint发现一 个问题,JSLint就会显示描述这个问题的消息,并指出错误在源代码中的大致位置。有些编码风格约定可能导致未预见的行为或错误,JSLint除了能指 出这些不合理的约定,还能标志出结构方面的问题。尽管JSLint不能保证逻辑一定正确,但确实有助于发现错误,这些错误很可能导致浏览器的 JavaScript引擎抛出错误。
评论
示例代码的排版,阅读性差了一点,尤其是被翻页隔开的代码阅读有点蛋疼
翻译的还是欠点火候,直接读代码比看文字清晰的多