第四版第七章 函数
1.函数的return语句.
原文:函数的return语句将停止函数的运行,并把表达式的值返回给函数调用者,如果函数不包含return语句,它就执行函数体中的每条语句,然后返回给函数调用者undefined;
备注:为了便于链式操作,return返回的值应该考虑其重用度.通常我们使用语句if(condition) return;让不具备执行条件的函数终止运行.
2.函数的参数
原文:函数调用时,先要计算括号之间指定的所有表达式,然后把他们的结果作为函数的参数;
备注:None
3.构造函数Function()
原文:传递给构造函数Function()的参数中没有一个用于说明它要创建的函数名,用Function()构造函数创建的未命名函数有时被称为匿名函数;
备注:使用直接量/字面量也可以创建匿名函数;
原文:Function构造函数允许我们动态地创建和编译一个函数,它不会将我们限制在function语句预编译的函数体中,负面效应是每次调用一个函数,Function()构造函数都要对它进行编译
备注:预编译原理,待填充
4.函数直接量/字面量
原文:function语句/Function()构造函数和函数直接量定义三个基本相同的函数
function f(x){retrun x*x};var f = new Function('x','return x*x');var f = function(x) {return x*x};
备注:函数直接量与Function构造函数的区别(第四版11.5)
- (1)构造函数允许在运行时动态的创建和编译代码,但是函数直接量却是程序结构的一个静态部分;
- (2)每次调用构造函数都会解析函数体并且创造一个新的函数对象,如果对构造函数的调用出现在一个循环中,或者出现在一个经常被调用的函数中,这种方法的效率就非常低;
- (3)使用构造函数Function创建的函数不使用词法作用域,相反的,它们总是被当做顶级函数来编译.
原文:函数直接量创建的是匿名函数,但是语法规定它可以指定函数名,这在编写调用自身的递归函数时非常有用;
var f = function fact(x){if (x < 2) {return 1} else {return x*fact(x-1)}}
备注:等同于 var f = function(x){if (x < 2) {return 1} else {return x*arguments.callee(x-1)}};
5.arguments对象的length属性
原文:可以给arguments的length属性赋值;
备注:虽然可以更改arguments的length值,但与array不同的是,更改后并不影响参数的访问和调用.
e.g.
var f = function() {arguments.length = 1;console.log(arguments.length);console.log(arguments[1])}f(1,2);
6.arguments与局部变量
原文:Arguments对象的数组元素是存放函数的局部变量的同义词.arguments[]数组和命名了的参数不过是引用同一变量的两种不同方法.通过arguments[]数组改变参数的值同样会改变用参数名获取的参数值
备注:
e.g.
var f = function() {arguments[0] = 2;console.log(arguments[0])}f(1);var fn = function() {var x = 2;console.log(x)}fn(1);var func = function(x) {arguments[0] = 2;console.log(x)}func(1);
7.函数的length属性
原文:函数自身的length属性是只读的,返回的是函数需要的实际参数的数目,也就是在函数的形式参数列表中声明的形式参数的数目;
备注:原文中给出例子检查传递的参数的个数是否与函数声明时设定的形式参数的数目相同,主要用到arguments.callee方法;
8.call()和apply();
原文:call()和apply的第一个参数都是要调用的函数的对象,在函数体内这一参数是关键字this的值;
备注:call和apply经常用在函数回调以及将array-like转换为array时使用.
第四版第八章 对象
1.属性的枚举
原文:for/in循环列出的属性并没有特定顺序,而且虽然它能枚举出所有的用户定义的属性,但是却不能枚举出没有预定义的属性或方法;
备注:与in语句不同的是in会检查对象的原型链;
2.属性的删除
原文:删除一个属性并不仅仅是把该属性设置为undefined,而是真正的从对象中移除了该属性.用for/in循环可以证明两者之间的区别,它枚举的是已经被设为undefined的属性,但是不会枚举被删除的属性.
备注:None
3.类(构造函数)属性/方法
原文:类属性/方法是一个与类关联在一起的方法,而不是和类的实例关联在一起的方法.要调用类方法,就必须使用类本身,而不能使用该类的特定实例;
备注:类属性如Number.POSITIVE_INFINITY,类方法如Date.parse等,*查阅core javascript reference;
4.constructor属性
原文:每个对象都有constructor属性,它引用的是用来初始化该对象的构造函数.
备注:在以原型为基础的库/框架里,这是由原型链特征,原型对象的constructor需要重置.
5.toLocaleString()方法
原文:在ECMAScript v3中,Array,Date和Number都定义了自己的toLocaleString()方法.
备注:查阅后填充.
6.hasOwnProperty()方法
原文:如果对象局部定义了一个非继承的属性,属性名是由一个字符串实际参数指定的,那么该方法将返回true;
备注:in语句会检查原型链,而不只是用户自定义的属性;
7.对象局限性的方法;
hasOwnProperty(),propertyIsEnumberabel()方法都带有一定的局限性,都不会去检查原型链.