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 ...
随机推荐
- hdu 4497 GCD and LCM 质因素分解+排列组合or容斥原理
//昨天把一个i写成1了 然后挂了一下午 首先进行质因数分解g=a1^b1+a2^b2...... l=a1^b1'+a2^b2'.......,然后判断两种不可行情况:1,g的分解式中有l的分解式中 ...
- centos Ddos防范开源软件使用及apache ab压测 测试
1,检索特定字符的相同行,用于过滤点一些命令行的头说明
- Xcode7 使用NSURLSession发送HTTP请求报错
http://blog.csdn.net/chenyong05314/article/details/46721205
- Fire Net(dfs)
Fire Net Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- Android 基本控件
http://www.cnblogs.com/LT-blogs/archive/2012/08/07/2626118.html http://blog.csdn.net/android_tutor/a ...
- windows7旗舰版64位下安装、破解及执行QTP11报错
说明:假设你出现了下面几种情况,希望能解决你的问题:假设没有,就当路过. 1.安装qtp11时报vc++ 2005缺少,但怎么也不能安装成功 解决方法: 1.找到qtp安装包里面的vc++ 2005组 ...
- 移动端适配:font-size设置的思考
1. 问题的引出 如果html5要适应各种分辨率的移动设备,可以使用rem这样的尺寸单位,针对各个分辨率范围在html上设置font-size的代码: html{font-size:10px} @me ...
- Data Recovery Advisor (DRA)
数据恢复指导Data Recovery Advisor (DRA)的适用场景:Data Recovery Advisor 是11g 新特性,是Oracle 顾问程序架构的一部分,它会在遇到错误时自动收 ...
- 【MVC】过滤器
APS.NET MVC中(以下简称“MVC”)的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理.这时候就用到了过滤器. MVC支持的过滤器 ...
- WPF中timer的使用
Timer控件/ System.Timers.Timer 不能用于WPF中.在WPF中,定时器为 DispatcherTimer. 使用方法如下: private DispatcherTimer ti ...