JavaScript 整理笔记(五)

1.3 函数

1.3.4 参数

函数调用时,会得到一个 arguments 数组(类似数组,只拥有 length 属性),即调用函数时传入的参数。

var sum = function(){
	var s = 0;
	for(int i = 0; i < arguments.length; i++){
		s += arguments[i];
	}
	return s;
}
sum(1, 2); // 3
sum(1, 2, 3); // 6

1.3.5 返回

一个函数总是会返回一个值,如果没有指定return的值,则会返回 undefined。

var a = function(){
	return "a";
};
a(); // "a"
var b = function(){};
b(); // undefined

1.3.6 异常

var add = function(a, b){
	if(typeof a !== "number" || typeof b !== "number"){
		throw {
			name: "TypeError",
			msg: "Not A Number"
		};
	}
	return a + b;
}

throw 语句中断函数的执行后抛出一个 exception 对象,该对象会被一个 try…catch 语句捕捉到:

var tryCatchFn = function(){
	try{
		add("a", 1);
	} catch(exception){
		console.log(exception.name + ": " + exception.msg);
	}
}
tryCatchFn(); // TypeError: Not A Number

1.3.7 扩充类型的功能

JavaScript 允许给基本类型扩充功能。如给 Object.prototype 添加方法。

Function.prototype.create = function(name, func){
	// 创建方法前先判断是否有该方法存在
	if(!this.prototype[name]){
		this.prototype[name] = func;
	}
	return this;
}

创建一个转换为整数的函数:

Number.create("integer", function(){
	return Math[this < 0 ? "ceil" : "floor"](this);
});
(-4 / 3).integer(); // -1

创建一个去掉字符串前后空格的函数:

String.create("trim", function(){
	return this.replace(/^\s+|\s+$/g, "");
});
" abc ".trim(); // "abc"

1.3.7 递归

递归函数就是直接或间接调用自身的一种函数。如计算斐波拉切数列:

var fibonacci = function(n){
	if(n == 1 || n == 2){
		return 1;
	} else {
		return fibonacci(n - 1) + fibonacci(n - 2);
	}
}
fibonacci(6); // 8
// fibonacci(5) + fibonacci(4) => 
// fibonacci(4) + fibonacci(3) + fibonacci(3) + 1 => 
// fibonacci(3) + 1 + 1 + 1 + 1 + 1 + 1 =>  
// 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 => 
// 8
fibonacci(10); // 55

1.3.8 作用域

作用域是指变量再某个代码块中的可见性,减少了命名冲突:

var fn = function(){
	var a = 1;
	var b = 2;
	var fn2 = function(){
		var b = 3;
		var c = 4;
		a += c;
		// a = 5; b = 3; c = 4;
	};
	// a = 1; b = 2; c 未定义
	fn2();
	// a = 5; b = 2; c 未定义
};
函数 fn 中定义的变量在 fn2 中都是可见的,这个要注意在函数 fn2中使用 fn 函数的变量要非常小心,最好的办法就是在函数体的顶部声明函数可能用到的所有变量。

欢迎访问我的博客 Ama_zhe
--------内容系个人整理,如有错误,欢迎指出。谢谢!--------

你可能感兴趣的:(JavaScript)