JS函数全解、闭包、递归、柯里化

函数的返回值由什么确定? 

影响因素:

1.调用时输入的参数params

2.定义时的环境env

let x1 = 'x'
let a = '1'
function f1(x1){
    return x1 + a
}

a = '3'
{
    let a = '2'
    
    console.log(f1('x'))   // 'x3'
    
}
a = '4'

// 这个例子说明a是定义时的a ,而不是执行时的a
let x1 = 'x'
let a = '1'
function f1(c){
    c()
}

{

    let a = '2'
    function f2(){
        console.log(x1+a)  // x2
        
    }
    f1(f2)
}

闭包

如果在函数里面可以访问外面的变量,那么这个函数+这些变量=闭包

闭包特点:

1 能让一个函数维持住一个变量

2 但并不能维持这个变量的值

3 尤其是变量的值会变化的时候

JS里的函数特点:

  • 支持闭包
  • 创建函数作用域
  • *有arguments
  • *有this
  • *支持new语法糖
  • 是一个对象,有name、length、call、apply、bind属性
  • 0-n个参数、1个返回值

注:箭头函数没有arguments、this、不支持new语法糖

const a = 222
const f2 = ()=>console.log(a)

console.log(this)
const f1 = ()=>console.log(this)

// 箭头函数如何处理a,就如何处理this

即  箭头函数把this当做外部的变量,仅此而已

但是非箭头函数的this有很多特殊处理

箭头函数不支持this指的就是箭头函数对this与其他变量一视同仁,不会特殊对待。

this的确定

显示this

fn.call(asThis,1,2)
fn.bind(asThis,1,2)()
obj.method.call(obj,'hi')

隐式this

fn(1,2)  // fn.call(undefined,1,2)
obj.method('hi')  // obj.method.call(obj,'hi')
array[0]('hi') // array[0].call(array,'hi')

递归

斐波那契数列

fib=(n) =>
     n === 0 ? 0 :
     n === 1 ? 1 :
     fib(n-1) + fib(n-2)

所有的递归都可以改写循环

fib = (n) =>{

    let array = [0,1]
    for(let i=0;i<=n-2;i++){
        array[i+2] = array[i+1] + array[i]
        
    }

    return array[array.length - 1]

}

类似的例子

React.memo、 React.userCallback 用来减少计算

柯里化 currying

让所有函数只接受一个参数,主要用于函数式编程。

单一参数有什么意义?

基于单一参数函数,已经衍生出非常多理论知识,如λ演算等。

柯里化一个函数就是 把多参数函数,变成单参数函数。

如何把add(1,2,3)变成curriedAdd(1)(2)(3)

const curriedAdd = a =>

                   b=>

                   c=>

                   a+b+c

你可能感兴趣的:(javascript,前端,开发语言)