1、Function类型三种定义方法,函数声明定义跟函数表达式定义法的区别在于,计算器会率先读取函数声明,使其在执行代码之前可用,函数表达式必须等到解析器执行到它所在的代码行,才会真正被解析。
//函数声明定义法 function sum(num1,num2) { return num1+num2 } //函数表达式定义法 var sum=function(num1,num2){ return num1+num2 } //Function 构造函数 var sum=new Function("num1","num2","retrun num1+num2");//不推荐,计算机解析2次
2、函数没有重载
3、作为值的函数,函数本身就是变量,所以函数也可以作为值来使用。
function callSomeFunction(someFunction,someArgument) { return someFunction(someArgument); } function add10(num){ return num+10; } var result=callSomeFunction(add10,10); alert(result); //20; function getGreeting(name){ return "Hello,"+name; } var result2=callSomeFunction(getGreeting,"Joy"); alert(result2); //Hello,Joy
4、从一个函数返回另外一个函数,这是极为有用的一种方法
function creatComparisonFunction(propertyname){ return function(object1,object2){ var value1=object1[propertyname]; var value2=object2[propertyname]; if(value1<value2) { return -1; }else if(value1>value2) { return 1; }else{ return 0; } }; } var data=[{name:"Za",age:28},{name:"Ni",age:29}]; data.sort(creatComparisonFunction("name")); alert(data[0].name); //Ni data.sort(creatComparisonFunction("age")); alert(data[0].name); //Za
5、函数内部属性arguments和this,arguments包含传入函数中的所有参数,这个对象还有一个calle属性,该属性是一个指针,指向拥有这个arguments对象的函数。
递归算法 阶乘 function factorial(sum) { if(num<=1) { return 1; } else{ return num*arguments.calle(num-1) } } var trueFactorial=factorial; factorial=function(){ return 0; } alert(trueFactorial(5)); //120 alert(factorial(5)); //0
6、函数属性和方法,length(表示参数的个数),prototype
7、apply()和call()方法,在特定的作用域中调用函数。apply接收2个参数,一个是在其中运行函数的作用域,另外一个可以是参数数组也可以是arguments对象。call()接收参数的方式为,第一个是this值,其余参数都直接传递给函数。apply和call真正的用武之地是扩充函数.
8、bind()方法,创建一个函数的实例,其this值会被绑定到传给bind()函数的值。
window.color="red"; var o={color:"blue"}; function sayColor(){ alert(this.color); } var objectSayColor=sayColor.bind(o); objectSayColor(); //blue;