javascript学习八:函数的定义和传值

函数的定义

函数就是一个非常特殊的对象,是一个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;
    }

你可能感兴趣的:(JavaScript)