函数的参数和return事项
函数的参数
1、参数是局部变量 ,优先级高于同名的全局变量。
2、是为了解决函数的抽象化、多态化。具备模块化功能。
3、js因为是弱引用语言,参数可以多样化变化,但也因此造成了函数中需要对参数做大量的判断。
4、参数也可以作为递归中初始设置变量。
5、在多函数中,参数可以被作为中介值来回传递,并且处理,减少全局变量。
6、js中参数没有初始值(ES5),参数是没有类型区分(大量判断)
参数的先后问题 (必须参数在前,不必须参数在后),(ES5)参数没有若干但是有arguments
函数的return
1、使用return跳出函数,条件作用时,使用return可以解决多分支解构。
return使用跳出时直接跳出循环或者条件,返回undefined
使用return可以在 setInterval或者快速连续调用时用于防抖 ,使用return可以完成函数的开关操作
2、工厂模式种使用return返回对象。
3、单例模式后续我会发布具体单例模式的详细介绍
4、返回参数对象
5、如果参数是函数,返回回调函数的结果
6、返回数组或者对象,用于返回多个元素
7、返回函数体
闭包
闭包是指有权访问另一个函数作用域中的变量的函数,
创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量
特点:函数嵌套函数、函数内部可以引用外部的参数和变量。
function fn1(){
var a=1;
// 因为返回的函数被存储在全局变量中,
// 并且这个返回的函数使用这个a的局部变量,因此a被保存在堆中
return function(){
a++;
console.log(a);
}
}
闭包优点:
1、希望一个变量长期驻扎在内存中
2、为了解决变量污染
3、为了得到私有变量
缺点:
参数和变量不会被垃圾回收机制回收、会造成内存泄漏。
柯里化函数
把接收多个参数的函数变换成接收一个单一参数的函数
这里用求和来举个例子
function curry(fn){
var arr = [];
return function(){
if(arguments.length>0){
arr = arr.concat(Array.from(arguments));
return arguments.callee;
}else{
return fn.apply(null,arr)
}
}
}
function fns(){
return Array.from(arguments).reduce((value,item)=>value+=item)
}
var sum = curry(fns);
// sum(1);
// sum(2,3,4);
// sum(5,6);
var s = sum(1)(2,3)(4,5,6)()
console.log(s)
反柯里化函数
把单一的一个参数添加到多个参数中来处理
Function.prototype.unCurrying=function(){
var self=this;
return function(){
return Function.prototype.call.apply(self,arguments);
}
}
var push=Array.prototype.push.unCurrying();
function getSum(){
push(arguments,5);
console.log(arguments)
}
getSum(1,2,3,4);