函数就是一个非常特殊的对象,是一个Function类的实例,其实在内存中存储的操作是通过一个键值对来存储的。
function fn1() {
alert("fn1");
}
//函数就是一个非常特殊的对象,是一个Function类的实例,其实在内存中存储的操作是通过一个键值对来存储的
alert(typeof fn1);
函数虽然是一个对象,但是却和对象有一些区别,对象是通过引用的指向完成对象的赋值的,而函数却是通过对象的拷贝来完成的。
//由于函数是一个对象,所以可以通过如下方式定义
//以下是通过函数的拷贝来完成赋值,两个引用并没有指向同一个对象
var fn2 = fn1;
fn2();
fn1 = function() {
alert("fnn1");
}
/** * 函数虽然是一个对象,但是却和对象有一些区别,对象是通过引用的指向完成对象的赋值的,而函数却是通过对象的拷贝来完成的 * 所以fn1虽然变了,并不会影响fn2 */
fn2();//返回fn1
fn1();//返回fnn1
对于对象而言,是通过引用的指向来完成赋值的
/** * 对于对象而言,是通过引用的指向来完成赋值的,此时修改o1或者o2会将两个值都完成修改 */
var o1 = new Object();
var o2 = o1;
o2.name = "Leon";
alert(o1.name);//返回Leon
函数的参数和调用没有关系,如果函数只有一个参数,但是却传入了两个参数,仅仅只会匹配一个,所以在js中函数不存在重载。
函数是对象,不存在重载,只存在覆盖,后面定义的会覆盖前面定义的。
var sum = function(num1,num2) {
return num1+num2;
}
var sum = function(num1) {
return num1+100;
}
alert(sum(19)); //返回119
alert(sum(19,20));//返回119
函数的第二种定义方式:
//函数有如下一种定义方式
/** * 如下定义方式等于定义了一个 * function fn(num1,num2){ * alert(num1+num2); * } * 所以通过以下的例子,充分的说明函数就是一个对象 */
var fn = new Function("num1","num2","alert('fun:'+(num1+num2))");
fn(12,22);
由于函数是对象,所以可以直接把函数通过参数传递进来
/** * 由于函数是对象,所以可以直接把函数通过参数传递进来 * 通过下面的函数可以调用任意别的函数 */
function callFun(fun,arg) {
//第一个参数就是函数对象
return fun(arg);
}
function sum(num) {
return num+100;
}
function say(str) {
alert("hello "+str);
}
//var say = xxx
//调用了say函数
callFun(say,"Leon");
//调用了sum函数
alert(callFun(sum,20));
函数还能返回函数,此时的作用域就变宽了。
function fn1(arg) {
/** * 此时返回的是一个函数对象 */
var rel = function(num) {
return arg+num;
}
return rel;
}
//此时f是一个函数对象,可以完成调用
var f = fn1(20);
alert(f(20));
alert(f(11));
范例:用函数返回传值的方式来对数组大小进行排列
先参考w3school关于sort方法使用的最后一个例子
/** * 根据数字来进行排序的函数 */
function sortByNum(a,b) {
return parseInt(a)-parseInt(b);
}
var as = [1,2,"11px",33,"12px",190];
//对于js而言,默认是按照字符串来进行排序的
as.sort(sortByNum);
alert(as);
在这里额外提一点东西
//当将进行加法的时候,不会自动转换,返回111
alert("11"+1);
//当进行减法的时候,会自动完成转换,返回10
alert("11"-1);
测试根据对象排序
function Person(name,age) {
this.name = name;
this.age = age;
}
var p1 = new Person("Leno",39);
var p2 = new Person("John",23);
var p3 = new Person("Ada",41);
var ps = [p1,p2,p3];
ps.sort(sortByAge);
/** * 使用以下方法来处理排序,带来的问题是需要为每一个属性都设置一个函数,显然不灵活 * 但是如果通过函数的返回值调用就不一样了 */
function sortByName(obj1,obj2) {
if(obj1.name>obj2.name) return 1;
else if(obj1.name==obj2.name) return 0;
else return -1;
}
function sortByAge(obj1,obj2) {
return obj1.age-obj2.age;
}
让Sort更加灵活:用函数返回传值的方式来定义
ps.sort(sortByProperty("age"))
function sortByProperty(propertyName) {
var sortFun = function(obj1,obj2) {
if(obj1[propertyName]>obj2[propertyName]) return 1;
else if(obj1[propertyName]==obj2[propertyName])return 0;
else return -1;
}
return sortFun;
}