kying-star的博客

vuePress-theme-reco kying-star的博客    2023
kying-star的博客

Choose mode

  • dark
  • auto
  • light
主页
指北
语言学习
AI
前端
后端
算法
杂项
github

kying-star的博客

7

Article

0

Tag

主页
指北
语言学习
AI
前端
后端
算法
杂项
github
  • js
    • 彻底了解This指针
    • 原型与原型链
    • AJAX
    • 防抖与节流
    • 闭包
    • 懒加载
    • 轮播图
    • js作用域
    • JS高阶函数和运行机制
  • css
  • vue
  • typescript
  • React
  • 前端新技术
  • 正则表达式
  • 浏览器

vuePress-theme-reco kying-star的博客    2023

闭包

kying-star的博客

# 闭包

js支持闭包,也就是函数可以访问函数外的变量。

例如

var hello = "hello"

function sayhi(){
    console.log(hello)
}

sayhi()//hello

注意闭包不是在定义时保存变量,而是实时的访问

例如

var hello = "hello"

function sayhi(){
    console.log(hello)
}
hello = "byebye"
sayhi()//byebye

# 函数柯里化

利用闭包的特性,可以将函数柯里化

柯里化指将接受多个参数的函数转为接受单一参数的函数

例如实现三数之和

var plus = (a,b,c)=>a + b + c

var add = (a)=>(b)=>(c)=>a + b + c;//es6写法

 console.log(plus(1,2,3));//6
 
 console.log(add(1)(2)(3));//6

也可以通过封装将一个函数柯里化

var plus = (a,b,c)=>a+b+c
 //限定参数个数的柯里化的封装

 function curry(fn){
    let len = fn.length;//获取参数的个数
    return function temp(){
        let args = [...arguments]; //定义一个数组接收展开的arguments      
        if(args.length>=len){//收集参数大于等于原函数设定的参数个数时
            return fn(...args);//将数组展开。展开符...(将数组展开为数的序列)
             					//[1,2,3]=>1,2,3
        }else{//否则就返回函数,实现柯里化
            return function(){
               return  temp(...args,...arguments)
            }
        }
    }
 }

 var addsum = curry(plus)//调用柯里化函数,将plus()柯里化
 console.log(addsum(3)(2)(1));//6

# 先到这里以后来填坑