代码信息来自于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. JIRA官方:JIRA定制工作流

    定制适合项目的工作流 JIRA提供了一个缺省工作流和一系列问题类型,非常适合缺陷追踪和软件开发.在使用中你可以随时根据实际情况对流程进行调整,确保流程能够快速的适应坏境变化. 使你的工作流图形化 使用 ...

  2. 【LeetCode练习题】Linked List Cycle II

    Linked List Cycle Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it ...

  3. 搭讪培训班 - 名品试用 - YOKA时尚论坛 - YOKA社区

    搭讪培训班 - 名品试用 - YOKA时尚论坛 - YOKA社区 搭讪培训班 发贴回复 发新话题 发布投票 搭讪培训班   1330 1 阅读 回复 跳转到指定楼层 加为好友 时尚懒洋洋 工作:无业游 ...

  4. Linux主机规划与磁盘分区

    各硬件设备在Linux中的文件名 在Linux系统当中,几乎所有的硬件设备文件都在/dev这个目录内. 各硬件设备在Linux中的文件名: 设备 设备在Linux中的文件名 IDE接口的硬盘 /dev ...

  5. TimeSpan类【转】

    TimeSpan ts1 = new TimeSpan(DateTime.Now.Ticks); //获取当前时间的刻度数 //执行某操作 ............................ . ...

  6. Oracle存储过程 使用游标、数组的配合查询

    查询输入的门牌号码是否在标准门牌库中存在.存在则返回相应的号码. public string GetValidate(){ OracleConnection conn = ConnectOra(); ...

  7. 回滚Swtichover

    从11.2.0.2开始,如果由于某种原因switchover没有成功,可以回滚switchover. For physical standby databases in situations wher ...

  8. maven简单工具命令

    (一)聚合项目的创建//创建父项目mvn archetype:create -DgroupId=com.ztesoft.resmaster -DartifactId=lifecycle<pack ...

  9. Linux下安装jdk1.8

    相信码农们绝对禁不住linux系统的诱惑,同样在linux的世界里少不了java,下面笔者就和大家分享一下我的jdk1.8安装过程吧,新接触linux的童鞋们完全可以按照我提供的图片中的命令来安装哦- ...

  10. MySql中游标使用总是多循环一次的解决方法

    CREATE DEFINER = 'root'@'%' PROCEDURE deyestest.procedure2() BEGIN DECLARE v_id INT; DECLARE v_userN ...