JavaScript函数学习小结02
参数
当函数被调用的时候,会得到一个免费配送的参数,那就是arguments数组。函数可以通过此参数来访问所有函数被调用时传递的参数列表,包括那些没有被分配给函数声明时定义的形式参数的多余参数。这使得编写一个无须指定参数个数的函数成为可能:
//构造一个将大量值相加的函数
//这个函数内部定义的变量sum不会与外部定义的sum产生冲突
//该函数只会看到内部的那个变量
var sum = function(){
var i, sum;
for(i = 0; i < arguments.length; i++){
sum += arguments;
}
return sum;
}
documents.writeln(sum(4, 8, 15, 16, 23, 42))
这并不是一个特别有用的模式。
因为一个语言的设计错误, argruments并不是一个真正的数组。它只是一个"类似数组(array-like)"的对象。arguments拥有一个length属性,但是它并没有任何数组的方法。这将会导致一个错误,后面会说到。
返回Return
当一个函数被调用时,它从第一个语句开始执行,并在遇到关闭函数体的 } 时结束。然后函数把控制权交还给调用该函数的程序。
return语句可以用来将函数提前返回,当return被执行时,余下的语句就不会被执行而立即返回。
函数总会返回一个值,如果没有指定返回值,则会返回undefined。
如果函数前面加了 new 前缀,且返回值不是一个对象,则返回 this (该新对象)。
异常Exceptions
JavaScript提供一套异常处理机制,异常是干扰程序的正常执行流程的不寻常的事故。当发生这样的事故时,程序应该抛出一个异常:
var add = function (a, b){
if(typeof a !== 'number' || typeof b !== 'number'){
throw{
name: 'TypeError',
message: 'add needs numbers'
};
}
return a + b;
}
throw语句会中断函数的执行。它应该抛出一个exception 对象,该对象包含一个用来识别异常类型的name属性和以恶描述的message 属性。你也可以添加其他属性。
该exception 对象将被传递到 一个try 语句和一个 catch从句:
// 构造一个try_it函数,以不正确的形式调用之前的 add 函数。
var try_it = function(){
try{
add("seven")
}catch(e){
document.writeln(e.name + ":" + e.message);
}
}
try_it()
一个 try 语句只会有一个捕获所有异常的 catch 代码块。 如果你的处理手段取决于异常的类型,那么异常处理器必须检查异常对象的name属性来确定异常的类型。
扩充类型的功能
JavaScript允许给语言的基本类型 扩充功能。
举例说明,我们可以给 Function.prototype 增加方法来使得该方法对所有函数可用:
Function.prototype.method = function(name, func){
this.prototype[name] = func;
return;
}
通过给Function.prototype增加一个method方法,我们下次给对象增加方法的时候就不必键入 prototype 这几个字符,省掉一些麻烦。
JavaScript没有专门的整数类型,但是有时候确实只需要提取数字中的整数部分。JavaScript本身提供的取整方法有些丑陋。我们可以通过给 Number.prototype 增加一个interger来改善他。他会根据数字的正负来判断是使用 Math.ceiling 还是math.floor.
Number.method('integer', function(){
return Math[this < 0 ? 'ceil' : 'floor']
});
document.writeln((-10 / 3).integer()); // -3