代码信息来自于http://ejohn.org/apps/learn/。

函数的长度属性如何工作?

function makeNinja(name){}
function makeSamurai(name, rank){}
console.log( makeNinja.length == 1, "只定义了一个形参" );
console.log( makeSamurai.length == 2, "定义了两个形参" );

很清楚,函数的长度就是定义形参的个数。

我们可以利用这一点写重载函数

function addMethod(object, name, fn){
// 存储对过去方法的引用
var old = object[ name ]; // 重写新的方法
object[ name ] = function(){
// 核对定义形参的个数,
// 与我们接受接收参数的个数
if ( fn.length == arguments.length )
// 如果匹配运行这个函数
return fn.apply( this, arguments ); // 否则调用过去的方法
else if ( typeof old === "function" )
return old.apply( this, arguments );
};
}

来看一看重载函数的运用

function addMethod(object, name, fn){
// 存储对过去方法的引用
var old = object[ name ]; // 重写新的方法
object[ name ] = function(){
// 核对定义形参的个数,
// 与我们接受接收参数的个数
if ( fn.length == arguments.length )
// 如果匹配运行这个函数
return fn.apply( this, arguments ); // 否则调用过去的方法
else if ( typeof old === "function" )
return old.apply( this, arguments );
};
} function Ninjas(){
var ninjas = [ "Dean Edwards", "Sam Stephenson", "Alex Russell" ];
addMethod(this, "find", function(){
return ninjas;
});
addMethod(this, "find", function(name){
var ret = [];
for ( var i = 0; i < ninjas.length; i++ )
if ( ninjas[i].indexOf(name) == 0 )
ret.push( ninjas[i] );
return ret;
});
addMethod(this, "find", function(first, last){
var ret = [];
for ( var i = 0; i < ninjas.length; i++ )
if ( ninjas[i] == (first + " " + last) )
ret.push( ninjas[i] );
return ret;
});
} var ninjas = new Ninjas();
console.log( ninjas.find());
console.log( ninjas.find("Sam"));
console.log( ninjas.find("Dean", "Edwards"));
console.log( ninjas.find("Alex", "X", "Russell"));

实例化ninja时,向ninja执行了4次添加方法,每次都覆盖在find属性上,根据闭包的作用域链,新的方法仍然可以引用addMethod里old,old保存的是上一个方法。

最后的find就是判断参数,与形参数量是否相同,是就执行,不是就调用old的方法。如此反复。

等同于以下代码

var ninjas = {
find: function(){
var ninjas = [ "Dean Edwards", "Sam Stephenson", "Alex Russell"]
var old = function(){
var ninjas = [ "Dean Edwards", "Sam Stephenson", "Alex Russell"]
var old = function(){
var ninjas = [ "Dean Edwards", "Sam Stephenson", "Alex Russell"]
var old;
var fn = function(){
return ninjas;
}
if ( fn.length == arguments.length ) {
return fn.apply( this, arguments );
}else if ( typeof old === "function" ) {
return old.apply( this, arguments );
}
};
var fn = function(name){
var ret = [];
for ( var i = 0; i < ninjas.length; i++ )
if ( ninjas[i].indexOf(name) == 0 )
ret.push( ninjas[i] );
return ret;
}
if ( fn.length == arguments.length ) {
return fn.apply( this, arguments );
}else if ( typeof old === "function" ) {
return old.apply( this, arguments );
}
}
var fn = function(first, last){
var ret = [];
for ( var i = 0; i < ninjas.length; i++ )
if ( ninjas[i] == (first + " " + last) )
ret.push( ninjas[i] );
return ret;
}
if ( fn.length == arguments.length ) {
return fn.apply( this, arguments );
}else if ( typeof old === "function" ) {
return old.apply( this, arguments );
}
},
}
console.log( ninjas.find());
console.log( ninjas.find("Sam"));
console.log( ninjas.find("Dean", "Edwards"));
console.log( ninjas.find("Alex", "X", "Russell"));

javascript高级知识点——函数的长度的更多相关文章

  1. javascript高级知识点——函数原型

    代码信息来自于http://ejohn.org/apps/learn/. 向函数的原型中添加方法 function Ninja(){} Ninja.prototype.swingSword = fun ...

  2. JavaScript进阶知识点——函数和对象详解

    JavaScript进阶知识点--函数和对象详解 我们在上期内容中学习了JavaScript的基本知识点,今天让我们更加深入地了解JavaScript JavaScript函数 JavaScript函 ...

  3. JavaScript高级之函数的四种调用形式

    主要内容 分析函数的四种调用形式 弄清楚函数中this的意义 明确构造函对象的过程 学会使用上下文调用函数 了解函数的调用过程有助于深入学习与分析JavaScript代码. 本文是JavaScript ...

  4. Javascript高级程序设计——函数声明与函数表达式的区别

    在Javascript中,函数是Functioin类型的实例,所以函数也具备属性和方法,因为函数是对象,所以函数名自然就是指向对象的指针啦. 函数可以通过声明语法和表达式来定义: 声明:functio ...

  5. javascript高级知识点——闭包

    代码信息来自于http://ejohn.org/apps/learn/. 先给出一个权威的定义,函数对象可以通过作用域相互关联起来,函数体内的变量可以保存在函数的作用域内,这种特性称为闭包. 在闭包内 ...

  6. JavaScript高级程序设计--函数小记

    执行环境和作用域链   每个函数都有自己的执行环境.当执行流进入一个函数时,函数 的环境就会被推入一个环境栈中.而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境.   当代码在一个环境中 ...

  7. JavaScript高级知识点整理

    一.JS中的数组 1.数组的三种定义方式 (1).实例化对象 var aArray=new Array(1,2,3,4,5); (2).快捷创建 var aTwoArray = [1,2,3,&quo ...

  8. Javascript高级程序设计——函数

    函数Function 通过函数封装多条语句,在任何地方执行.javascript函数不会重载,相同名字函数,名字属于后定义的函数通过function关键词声明. function functionNa ...

  9. 2020/06/05 JavaScript高级程序设计 函数表达式

    函数表达式 函数定义的两种方式: 函数声明(函数声明提升,非标准name属性可访问给函数指定的名字) 函数声明提升:执行代码前先读取函数声明 function functionName(arg0, a ...

随机推荐

  1. js混淆 反混淆 在线

    js反混淆地址:http://www.bm8.com.cn/jsConfusion/ 在线javascript 混淆http://www.moralsoft.com/jso-online/hdojso ...

  2. hdu 4686 Arc of Dream_矩阵快速幂

    题意:略 构造出矩阵就行了 |   AX   0    AXBY   AXBY       0  |                                                   ...

  3. HDFS的运行原理(转载)

    原文地址:http://www.cnblogs.com/laov/p/3434917.html 简介 HDFS(Hadoop Distributed File System )Hadoop分布式文件系 ...

  4. JQuery弹出窗口小插件ColorBox

    本文来自: Small_陌 http://www.cnblogs.com/wggmqj/archive/2011/11/04/2236263.html 今天在博客园看到一篇<ASP.NET MV ...

  5. PHP高级特性基础

    php对象在内存中的区域:php对象名和对象存放的位置是不一样的,这一点和java是一模一样的,所以在php面向对象部分你完全可以套用java的思想去做.对象存放在堆区(heap)而对象名则和其他普通 ...

  6. 你知道为什么Xcode6中Swift没有智能提示和自己主动补全功能吗 ?

    你知道为什么Xcode6中Swift没有智能提示和自己主动补全功能吗 ? 长沙戴维营教育将为你解开这个巨大的谜团大BUG! http://www.ubuntucollege.cn/course/29/ ...

  7. windows7旗舰版64位下安装、破解及执行QTP11报错

    说明:假设你出现了下面几种情况,希望能解决你的问题:假设没有,就当路过. 1.安装qtp11时报vc++ 2005缺少,但怎么也不能安装成功 解决方法: 1.找到qtp安装包里面的vc++ 2005组 ...

  8. 事件:target与currentTarget区别

    target在事件流的目标阶段:currentTarget在事件流的捕获,目标及冒泡阶段.只有当事件流处在目标阶段的时候,两个的指向才是一样的, 而当处于捕获和冒泡阶段的时候,target指向被单击的 ...

  9. 7.19 SQL——函数

    select * from student select * from score select * from teacher select * from course select * from c ...

  10. CSS3中轻松实现渐变效果

    background: -moz-linear-gradient(top, #8fa1ff, #3757fa); /* Firefox */ background: -webkit-gradient( ...