javascript高级知识点——函数的长度
代码信息来自于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高级知识点——函数的长度的更多相关文章
- javascript高级知识点——函数原型
代码信息来自于http://ejohn.org/apps/learn/. 向函数的原型中添加方法 function Ninja(){} Ninja.prototype.swingSword = fun ...
- JavaScript进阶知识点——函数和对象详解
JavaScript进阶知识点--函数和对象详解 我们在上期内容中学习了JavaScript的基本知识点,今天让我们更加深入地了解JavaScript JavaScript函数 JavaScript函 ...
- JavaScript高级之函数的四种调用形式
主要内容 分析函数的四种调用形式 弄清楚函数中this的意义 明确构造函对象的过程 学会使用上下文调用函数 了解函数的调用过程有助于深入学习与分析JavaScript代码. 本文是JavaScript ...
- Javascript高级程序设计——函数声明与函数表达式的区别
在Javascript中,函数是Functioin类型的实例,所以函数也具备属性和方法,因为函数是对象,所以函数名自然就是指向对象的指针啦. 函数可以通过声明语法和表达式来定义: 声明:functio ...
- javascript高级知识点——闭包
代码信息来自于http://ejohn.org/apps/learn/. 先给出一个权威的定义,函数对象可以通过作用域相互关联起来,函数体内的变量可以保存在函数的作用域内,这种特性称为闭包. 在闭包内 ...
- JavaScript高级程序设计--函数小记
执行环境和作用域链 每个函数都有自己的执行环境.当执行流进入一个函数时,函数 的环境就会被推入一个环境栈中.而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境. 当代码在一个环境中 ...
- JavaScript高级知识点整理
一.JS中的数组 1.数组的三种定义方式 (1).实例化对象 var aArray=new Array(1,2,3,4,5); (2).快捷创建 var aTwoArray = [1,2,3,&quo ...
- Javascript高级程序设计——函数
函数Function 通过函数封装多条语句,在任何地方执行.javascript函数不会重载,相同名字函数,名字属于后定义的函数通过function关键词声明. function functionNa ...
- 2020/06/05 JavaScript高级程序设计 函数表达式
函数表达式 函数定义的两种方式: 函数声明(函数声明提升,非标准name属性可访问给函数指定的名字) 函数声明提升:执行代码前先读取函数声明 function functionName(arg0, a ...
随机推荐
- sql 数据库 庞大数据量 需要分表
17:04:05问下 在什么情况下 审核分区啊 ~..大熊..o○ 17:06:53这个要看应用~..大熊..o○ 17:07:37比如数据量很大,查询多是按照时间段查询,就可以用时间段来做分区~.. ...
- Javascript数组操作方法
1.shift:删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.shift(); //a:[2,3,4,5] ...
- 2.5 Local Methods in High Dimensions
curse of dimensionality 输入在p维立方体中符合均匀分布,如果需要覆盖比例r的体积,需要每个维度上\(e_p(r)=r^{1/p}\) \(e_{10}(0.01)=0.63,e ...
- 谈谈 WLST Custom Commands
在了解WLST定制命令之前,简单说一下WLST,WLST 全称叫Weblogic Scripting Tool, 它提供了一组预定义命令来方便Weblogic的用户通过命令行对Weblogic 实例, ...
- STL集合容器set按照由小到大或者由大到小的顺序存放元素
(1)由小到大 set<int,less<int>> M; M.insert(1960); M.insert(1952); M.insert(1771); M.insert(1 ...
- Swift中的集合类型
一.引子: 在2014年10月TIOBE编程语言排行榜中,Swift位居第18位,从2014WWDC发布会首次公布至今不到半年时间,swift一直受到编程人 员的追捧,其热衷程度并不亚于当红巨星Tay ...
- Android appcompat备案
使用Eclipse创建Android项目,project多出appcompat_v7,此情况在ADT升级到22.6.x版本后出现,22.3.x前版本不存在.此项为了实现向下兼容sdk的功能. 点击项目 ...
- oracle后台进程2
oracle中的进程共分为三类:用户进程.服务进程.后台进程.其中后台进程伴随实例的启动而启动,他们主要是维护数据库的稳定,相当于一个企业中的管理者及内部服务人员.他们并不会直接给用户提供服务. 一: ...
- css绝对定位、相对定位和文档流的那些事
前言 接触html.和css时间也不短了,但每次用div+css布局的时候心里还是有点儿虚,有时候干脆就直接用table算了,很多时候用div会出现些不可预料的问题,虽然花费一定时间能够解决,但总不是 ...
- 兼容IE6,IE7和firefox可以使用的一些css hack:
.一些问题是浏览器自身的问题,遇到问题发生无法避免的情况下,那就要考虑使用一些css hack了,以下是针对IE6,IE7和firefox可以使用的一些css hack:(1) a: 针对区别IE6 ...