javascript函数没有重载测试

   今天继续学习javascript系列教程,虽然是基础,但我觉得还是有必要用心来学习的,不要怕难,不用怕忘记,不要怕学不会。哪个高手不是从零开始的,我要坚定自己的学习信心,并且认真的走下去。虽然路途艰辛,但总会在尽头品尝到芬芳的味道。

  函数是定义一次但可以调用或执行任意多次的一段js代码。函数有时会有参数,即函数被调用时指定了值的局部变量。函数常常使用这些参数来计算一个返回值,这个值也成为了函数调用表达式的值。

 代码如下  

function box(){

alert("年龄");

}

function box(name,age){

return name+age;

}

alert(box('caibaojian',24)); //www.111cn.net

  tip:当函数遇到第一个return,就会终止函数往下执行。

  三:argument对象

  实际上,函数体内可以通过argument对象来接收传递进来的参数。

 代码如下  

function box(){

return arguments[0] + '|'+arguments[1]; //得到每次参数的值

}

alert(box('caibaojian',24));

arguments对象的length属性可以得到参数的数量。

function box(){

return arguments.length;

}

alert(box(1,2,3,4,5)); 5

  javascript函数没有重载功能

 代码如下  

function box(num,a){

return num+a;

}

function box(num){

return num;

}

alert(box(5,11)); 50 重载就是根据参数,选择相同函数而参数不同的函数。

  Javascript只认最后一个重名函数,根据顺序。

  但是javascript却可以通过自身属性去模拟函数重载。

  书上常见的比较无意义的例子,比如一个计算器函数,如果参数为两个数字,就执行加法运算。如果参数为三个数字,就执行乘法运算

  这个函数大家最容易想到的实现就是

 代码如下  

function calculate() {
    if (arguments.length == 2) {
        return arguments[0] + arguments[1];
    } 
    if (arguments.length == 3) {
        return arguments[0] * arguments[1] * arguments[2];
    } 
}

  alert(calculate(1, 3))

  这个函数看起来没什么不好,但随着需求的增多,if分支就会越来越庞大,而且对应的模式也越来越难看。虽然if对于语言来说没啥不好。但我们可以考虑使用另一个策略来实现这个需求。

  这就是一个新的函数重载模式。代码如下

 代码如下  

var map = function (arr, callback, pThis) {
    var len = arr.length;
    var rlt = new Array(len);
    for (var i = 0; i < len; i++) {
        if (i in arr) rlt[i] = callback.call(pThis, arr[i], i, arr); 
    }
    return rlt;
}
/**
 * 函数参数重载方法 overload,对函数参数进行模式匹配。默认的dispatcher支持*和...以及?,"*"表示一个任意类型的参数,"..."表示多个任意类型的参数,"?"一般用在",?..."表示0个或任意多个参数
 * @method overload
 * @static
 * @optional {dispatcher} 用来匹配参数负责派发的函数
 * @param {func_maps} 根据匹配接受调用的函数列表
 * @return {function} 已重载化的函数
 */
var FunctionH = {
    overload: function (dispatcher, func_maps) {
        if (!(dispatcher instanceof Function)) {
            func_maps = dispatcher;
            dispatcher = function (args) {
                var ret = [];
                return map(args, function (o) { return typeof o}).join();
            }
        }

        return function () {
            var key = dispatcher([].slice.apply(arguments));
            for (var i in func_maps) {
                var pattern  = new RegExp("^" + i.replace("*", "[^,]*").replace("...", ".*") + "$");
                if (pattern.test(key)) {
                    return func_maps[i].apply(this, arguments);
                } 
            }
        }
    }
};

  FunctionH.overload 包括两个参数,一个是负责处理匹配条件的dispatcher函数(可缺省),另一个是一组函数映射表,默认dispatcher函数是根据实际调用的参数类型生成一个字符串,例如调用的三个参数依次为10、”a”、[1,2]将生成”number,string,array”,具体实现模式匹配的时候,将根据函数映射表的每一个”key”生成一个正则表达式,用这个正则表达式匹配dispatcher函数的返回值,如果匹配,则调用这个key对应的处理函数,否则依次匹配下一个key。这样刚才那个计算机函数的需求就可以写成为

 代码如下  

var Calculate = FunctionH.overload({
    'number,number': function () {
        return arguments[0] + arguments[1];
    },
    'number,number,number': function () {
        return arguments[0] * arguments[1] * arguments[2];
    }
});

alert(Calculate(1,2,3));

  顺便对于浏览器兼容的代码也可以写成下面类似的形式

 代码如下  

var MSIE = navigator.userAgent.indexOf('MSIE') !== -1;
var foo = FunctionH.overload(function () {
    return MSIE ? "IE" : "NotIE";
}, {
    "IE": function () {
        alert('this is ie');
    },
    "NotIE": function () {
        alert('notie');
    }
});

foo();

时间: 2024-12-25 17:19:33

javascript函数没有重载测试的相关文章

javascript arguments与javascript函数重载

1.所 有的函数都有属于自己的一个arguments对象,它包括了函所要调用的参数.他不是一个数组,如果用typeof arguments,返回的是'object'.虽然我们可以用调用数据的方法来调用arguments.比如length,还有index方法.但是数 组的push和pop对象是不适用的. 2.函数定义时的参数个数和函数调用时的参数个数没有任何关系. 在函数中可以用f.arguments[0]和f.arguments[1]得到调用时传入的第一和第二个参数,arguments不能够创建

javascript函数重载解决方案分享

 本文主要介绍了javascript函数重载解决方案,利用JavaScript中的特殊对象arguments来模拟函数重载.用它来判断传入参数的个数或类型以区分重载 JS的函数定义可以指定形式参数名称,多多少少我们会以为js至少可以支持参数个数不同的方法重载,然而遗憾的是这仅仅是一个假象,js所有的参数都是以arguments传递过去的,这个参数类似于数组,在函数调用的时候,所有的实参都是保存在了这个数据结构里面,我们定义函数的时候所指定的形式参数其实是为这个数据结构里面的数据定义一个快捷的访问

测试JavaScript函数的性能

在软件中,性能一直扮演着重要的角色.在Web应用中,性能变得更加重要,因为如果页面速度很慢的话,用户就会很容易转去访问我们的竞争对手的网站.作为专业的web开发人员,我们必须要考虑这个问题.有很多"古老"的关于性能优化的最佳实践在今天依然可行,例如最小化请求数目,使用CDN以及不编写阻塞页面渲染的代码.然而,随着越来越多的web应用都在使用JavaScript,确保我们的代码运行的很快就变得很重要. 假设你有一个正在工作的函数,但是你怀疑它运行得没有期望的那样快,并且你有一个改善它性能

Javascript函数重载的例子介绍

js本身不支持重载,因为方法调用只与方法名相关,而不计较参数的数量和类型,也正是这个特点,我们可以用更简单的方法实现重载. 我们可以通过数组arguments来获取变量,再根据arguments.length来执行不同的操作. 简例: function getSum(){     //这是计算总和的函数     var sum=0;     for(var i=0;i<arguments.length;i++){         sum+=arguments[i];     }     retu

JavaScript 函数

JavaScript 函数定义 JavaScript 使用关键字 function 定义函数 函数可以通过声明定义,也可以是一个表达式 函数声明 函数声明的语法 : function sum1(n1,n2){ return n1+n2; }; 函数声明后不会立即执行,会在我们需要的时候调用到 分号是用来分隔可执行JavaScript语句,由于函数声明不是一个可执行语句所以不以分号结束 函数表达式,又叫函数字面量 JavaScript 函数可以通过一个表达式定义 函数表达式可以存储在变量中: va

浅谈javascript函数中的this

1) 当一个函数被保存为对象的一个属性时,我们称它为一个方法.当一个方法被调用时,this被绑定到该对象. 2) 当一个函数并非一个对象的属性,那么当它被调用时,this被绑定到全局对象.这一缺陷导致内部函数的this不一定是调用它的函数的this,解决办法是在外部函数定义一个新的变量指向this(例如var that = this; ). 3) 在一个函数前面带上new,将创建一个新对象,this绑定到新对象. 4) apply可以模拟一个对象拥有并执行该函数的场景,第一个参数传递对象给thi

从JavaScript函数重名看其初始化方式

JavaScript函数重名了会有什么后果?实验发现页面没有任何脚本错误提示,而且程序也运行了,只是对同名函数的调用执行了位置靠后的一个. 回头仔细一想,这个结果完全可以接受,因为脚本在页面里本身就是顺序执行下来的,包括函数的定义,但然如果只是定义 function foo(){} 这种形式,我们是跟踪不到函数初始化的.可是如果是定义类的方式,我们就可以明显地跟踪到函数的初始化顺序.比如: function foo() {} function foo.prototype.fn1() {} fun

JavaScript函数的调用以及参数传递_基础知识

JavaScript 函数调用 JavaScript 函数有 4 种调用方式. 每种方式的不同方式在于 this 的初始化.this 关键字 一般而言,在Javascript中,this指向函数执行时的当前对象. Note 注意 this 是保留关键字,你不能修改 this 的值.调用 JavaScript 函数 函数中的代码在函数被调用后执行.作为一个函数调用实例 function myFunction(a, b) { return a * b; } myFunction(10, 2); //

Javascript函数类型的判断

在判断函数类型时,我们使用的是typeof方法,比如: function fn(){   //content   }   alert(typeof fn)//结果是"function".  但是,该方法在一些浏览器中并不是像我们想像的那样工作. 1.Firefox2和Firefox3 在这两个浏览器中,用typeof检测HTML对象元素的类型,得到是一个不精确的"function"结果,而不是"object",如HTMLDocument.如: a