编程思维方式
- 面向对象编程:对现实世界中的事物进行抽象,通过封装、继承、多态来演示事物之间的联系
- 面向过程编程(函数式编程):对现实世界中事物的联系进行抽象,对运算过程进行抽象
- 函数式编程用来描述数据之间的映射
- x-> f(关系,映射) -> y 即 y=f(x)
- 相同的输入必然得到相同的输出(纯函数)
函数是一等公民
- 函数可以赋值给变量
- 函数可以作为参数
- 函数可以作为返回值
高阶函数
-
函数作为参数
遍历数组,对数组中每一项元素进行
fn
操作;foreach即高阶函数,抽象遍历数组部分的通用逻辑;将操作
fn
通过参数转入function foreach(arr,fn){ for(let i=0;i<arr.length;i++){ fn(arr[i]); } } let arr = [1,2,3,4,5]; foreach(arr,function(i){ console.log(i); }) 复制代码
-
函数作为返回值
once即高阶函数,用于控制只运行一次的逻辑function once(fn){ let done=false; return function(){ if(!done){ done = true; return fn.apply(fn,arguments); } } } let pay = once(function(money){ console.log(`支付了 ${money} RMB`); }) // 只会支付一次 pay(5); pay(5); pay(5); 复制代码
高阶函数的作用
高阶函数用来抽象函数通用部分,抽象可以帮我们屏蔽细节,是我们只关注于目标
闭包
在另一个作用域中,调用一个函数的内部函数,并通过内部函数访问到其内部变量;
例如:调用函数A返回的函数B,通过函数B访问函数A的局部变量
其实上面的 pay 函数也是一个闭包 ,因为访问了once函数的内部变量done
function A() {
let s = "closure";
return function B() {
console.log(s);
}
}
let b = A();
b();
复制代码
栈内存中的变量一般会在函数结束运行后进行垃圾回收,而堆内存中的变量则不会。堆内存变量通过判断是否还有其他引用,当所有对它的引用结束,才会被垃圾回收。
因此闭包中的变量不会存放在栈内存,而是存放在堆内存,这也能解释为什么放函数已经关闭,该函数内部的变量却还能被访问。
闭包的作用
延长局部变量的生存时间
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END