sortBy和闭包

sortBy函数接受一个名为property的参数并返回一个接受两个参数的新函数 ,本函数适于配合原生sort函数使用

示例:
people = {
                    {firsname:'ccfirstNeme',lastname:'aafirstNeme'},
                    {firsname:'bbfirstNeme',lastname:'bbfirstNeme'},
                    {firsname:'aafirstNeme',lastname:'ccfirstNeme'},
                }
people.sort(_.sortBy('lastname'))

函数定义为:

_.sortBy = (property)=>{
        return (a,b)=>{
                var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
                return result;
        }
}

显然,sortBy函数接受一个属性并返回另一个函数.返回函数作为compareFunction传递给sort函数.此处的问题是,持有着peoperty参数的返回函数是怎么得来的?

闭包的世界欢迎你.

在winter大大,重学前端中,大大如此解释闭包:

闭包翻译自英文单词closure,在计算机领域,它有三个完全不相同的意义:

  • 编译原理中,它是处理语法产生式的一个步骤;

  • 计算几何中,它表示包裹平面点集的凸多边形(翻译为凸包);

  • 在编程语言领域,它表示一种函数.

我们可以简单理解闭包为一个绑定了执行环境的函数,这个函数并不是印在书本里的一条简单的表达式,闭包与普通函数的区别是,它携带了执行环境,就像人在外星中需要自带吸氧的装备一样,这个函数也带有在程序中生存的环境.

在古典的闭包定义中,闭包包括两个部分:

  • 环境部分

    • 环境

    • 标识符列表

  • 表达式部分

对应于js,则是

  • 环境部分

    • 环境: 函数的词法环境(执行上下文的一部分)

    • 标识符列表: 函数中用到的未声明的变量

  • 表达式部分: 函数体

至此,我们可以认为,JS中的函数完全符合闭包的定义.它的环境部分是函数词法环境部分组成,它的标识符是函数中用到的未声明变量,它的表达式部分就是函数体.

回到我们的高阶函数来, 闭包有3个可访问的作用域:

  • 在它自身声明之内声明的变量

  • 对全局变量的访问

  • 对外部函数变量的访问(也即上述函数用到的)

上面说的第三个作用域体现了闭包的一个重要概念,闭包可以记住它的上下文!

下面继续我们的高阶函数吧.

Last updated