JavaScript语言精粹 函数

所有的过失在未犯以前,都已定下应处的惩罚


JavaScript中最好的特性就是它对函数的实现,它几乎无所不能,但是,想必你也能
预料到,函数在JavaScript里也并非万能药。

函数包含一组语句,它们是JavaScript的基础模块单元,用于代码复用,信息隐藏和组合调用函数用语指定对象的行为,一般来说,所谓编程就是将一组需求分解成一组
函数与函数结构的技能。


函数字面量

函数对象可以通过函数字面量来创建

var add = function (a,b) {
	return a + b;
}

var myObject = {
	value:0;
	increment:function(inc) {
		this.value += typeof inc == 'number' ? inc : 1;
	}
}
myObject.increment();
document.writeln(myObject.value); //1

myObject.increment(2);
document.writeln(myObject.vale); // 3


每个函数对象在创建时也附带有一个prototype属性,它的值是一个拥有
constructor属性且值即为该函数的对象

调用运算符是跟在任何产生一个函数值的表达式之后的一对圆括号。圆括号内可包含零个或
多个用逗号隔开的表达式,每个表达式产生一个参数值,每个参数值被赋予函数声明时定义的
形式参数名。当实际参数(arguments)的个数与形式参数(parameters)的个数不匹配时不会导致
运行时错误。如果实际参数值过多了,超出的参数值将被忽略。如果实际参数值过少,缺失的值将会被替换为
undefined。对参数值不会进行类型检查,任何类型的值得都可以被传递给参数。


new 前缀调用的函数被称为构造器函数。按照约定,它们保存在以大写格式命名的变量里。


参数
当函数被调用时,会得到一个免费的奉送的参数,那就是arguments数组,通过它函数可以访问所有它被调用时传递给它的参数列表,包括那些没有分配给函数声明定义的形式参数的多余参数这就使得编写一个无须指定参数个数的函数成为可能
<script language="javascript" type="text/javascript">
	 var sum  = function(){
  		var i ,sum =0;
		for (i = 0; i < arguments.length;i++) {
			sum += arguments[i];
		}
		return sum;
 	};
 alert(sum(12,8));// 20


因为语言的一个设计错误,arguments并不是一个真正的数组。它只是一个“类似数组”的对象。 arguments拥有一个length属性,但它缺少所有数组方法。

函数返回值

一个函数总是会返回一个值。如果没有指定返回值,则返回"undefined".
如果函数以在前面加上new前缀的方式来调用,且返回不是一个对象
则返回this( 该新对象)


      
  function a() {
	  document.writeln("a");
	}
	
	alert(a()); // undefined
	alert(new a()); //[object Object]


	 var bb = function a () {
 		alert("bb");
	  }();  // 注意()alert("bb");

	  function a() {
		alert("bb");
	  }();   // 错误


函数异常

JavaScript提供一套异常处理机制


<script   language="javascript"  type="text/javascript">
var add = function(a,b) {
   if (typeof a != 'number'|| typeof b!= 'number') {
   		throw {
			name :'TypeError',
			message:'add needs numbers'
		};
		return a+ b;
   }
}
var  try_it = function () {
 try {
 	add('seven');
 }catch (e) {
    document.writeln(e.name+':'+e.message)
 }
} 
try_it(); // add needs number
</script>

如果在try代码块内抛出一个异常,控制权就会跳转到它的catch从句
一个try语句代码块只会有一个将捕获所有异常的catch代码块。如果你的处理手段
取决于异常类型,那么异常处理器必须检查异常对象的name属性以确定异常的类型。


闭包

var myObject = function () {
	var value = 0;
	return {
		increment:function (inc) {
			value += typeof inc =='number'?inc:1;
		},
		getValue:function () {
			return value;
		}
	}
}();// 注意这里


注意最后一行(常常看到别人的代码),我们并没有把一个函数赋值给myObject,我们是把调用该函数后返回的结果赋值给它。注意作后一行();该函数返回一个包含两个方法的对象,并且这些方法继承享有访问value变量的特权。
var quo = function (status) {
	return {
		get_status:function () {
			return status;
		}
	};
}
var myQuo = quo ("amazed") ;
alert(myQuo.get_status());//amazed

这个quo函数被设计成无须在前面加上new来使用,所以名字也没有首字母大写,
当我们调用quo时,它返回包含get_status方法的一个新对象,该对象的一个引用保存在myQuo中,
即使quo已经返回了,但get_status方法仍然享有访问quo对象的status属性的特权。get_status方法并不是
访问该参数的一个拷贝,它访问的就是该参数本身,这是可能因为该函数可以访问
它被创建时所处的上下文环境。这就被称为闭包。




回调
模块
级联
套用
记忆

你可能感兴趣的:(JavaScript,编程,prototype)