函数javascript
闭包java
<script type="text/javascript"> <!-- 在正常的脚本中,某个方法能够获取到外部的变量,或者全局变量 --> var num = 11; function func1(){ console.log(num); } func1(); <!-- 可是在外部是没法获取方法内部的局部变量的 --> function func2(){ var num1 = 22; num2 = 33; } func2(); <!--console.log(num1); 会报错!--> console.log(num2); <!--能够获取到num2的值,由于不适用var定义变量时,默认是全局变量 --> <!-- 那么如何在外部获取到内部的变量呢!javascript能够办到 --> function func3(){ var num3 = 44; function func4(){ return num3; } return func4; } var func = func3(); console.log(func()); </script>
在外部没法获取到func3内部的局部变量,可是func3内部的局部方法func4却能够获取到,所以 返回一个func4的引用 ,这样在外部经过这个func4就能够获取到func3的内部变量。编程
虽然是绕了一个圈子,可是在方法外部却经过这样一个手段获取到了内部的值。数组
而这个方法内的局部方法func4就叫作闭包,按照不少书上的概念,这个方法搭建了方法内部与方法外部的桥梁,使得在外部也能够任意的获取到方法内部的资源。闭包
可是闭包会形成变量在内存中持久占用,所以会有必定的性能问题,最好不要轻易使用,即使使用也要在恰当的实际进行释放。app
函数调用编程语言
调用一个函数会暂停当前函数的执行,传递控制权和参数给新函数。除了声明时定义的形式参数,每一个函数还接收两个附加的参数:this和arguments.函数
方法调用模式性能
//建立myObject对象。它有一个value属性和一个increment方法this
//increment方法接受一个可选的参数。若是参数不是数字,那么默认使用数字1
var myObject = {
value:0,
increment:function(inc){
this.value +=typeof inc ==='number'?inc:1;
}
};
myObject.increment();
document.writeln(myObject.value);//1
myObject.increment(2);
document.writeln(myObject.value);//3
函数调用模式
构造器调用模式
//建立一个名为Quo的构造器函数。它构造一个带有status属性的对象。
var Quo = function(string){
this.status = string;
}
//给Quo的全部实例提供一个名为get_status的公共方法
Quo.prototype.get_status = function(){
return this.status;
}
//构造一个Quo实例
var myQuo = new Quo("confused");
document.writeln(myQuo.get_status());//打印显示confused.
Apply调用模式
//构造一个包含两个数字的数组,并将它们相加
var array = [3,4];
var sum = add.apply(null,array);//sum值为7
//构造一个包含status成员的对象
var statusObject = {
status:'A-OK'
}
//statusObject并无继承自Quo.prototype,但咱们能够在statusObject上调用get_status方法,尽管statusObject并无一个名为get_status的方法。
var status = Quo.prototype.get_status.apply(statusObject); //status值为‘A-OK’
参数
//构造一个将大量的值相加的函数。
//注意该函数的内部定义的变量sum不会与函数外部定义的sum产生冲突
//该函数只会看到内部的那个变量
var sum = function(){
var i,sum =0;
for(i=0;i<arguments.length;i+=1){
sum+=arguments[i];
}
return sum;
};
document.writeln(sum(4,8,15,16,26,42));//108
返回
异常
var add = function(a,b){
if(typeof a!=='number'||typeof b!=='number'){
throw{
name:'TypeError',
message:'add nedds numbers'
};
}
return a+b;
}
//构造一个try_it函数,以不正确的方式调用以前的add函数
var try_it = function(){
try{
add("seven");
}catch(e){
document.writeln(e.name+':'+e.message);
}
}
try_it();
扩充类型的功能
Function.prototype.method = function(name,func){
this.prototype[name] = func;
return this;
}
经过给Function.prototype增长一个method方法,咱们下次给对象增长方法的时候就没必要键入prototype这几个字符,省掉了一点麻烦。
Number.method('integer',function(){
return Math[this<0?'ceil':'floor'](this);
});
document.writeln((-10/3).integer());//-3
String.method('trim',function(){
return this.replace(/^\s+|\s+$/g,'');
})
document.writeln('"+" neat ".trim()+'"');
//符合条件时才增长方法
Function.prototype.method = function(name,func){
if(!this.prototype[name]){
this.prototype[name] = func;
}
return this;
}
递归
继承
this
未完待续……
注:如若喜欢,欢迎转载,请在文章页面明显位置给出此文连接!
若您以为这篇文章还不错请点击下右下角的推荐,有了您的支持才能激发做者更大的写做热情,很是感谢!