JS学习-闭包

来源:互联网 发布:月经半个月不干净知乎 编辑:程序博客网 时间:2024/05/20 15:38

函数作为返回值

高阶函数除了可以接收函数作为参数外,还可以把函数作为结果返回。

function lazy_sum(arr) {    var sum = function () {        return arr.reduce(function (x, y) {            return x + y;        });    }    return sum;}var f1 = lazy_sum([1, 2, 3, 4, 5]);var f2 = lazy_sum([1, 2, 3, 4, 5]);f1 === f2; // false//函数每次调用都开辟新的内存空间

注意的问题

function count() {    var arr = [];    for (var i=1; i<=3; i++) {        arr.push(function () {            return i * i;        });    }    return arr;}var results = count();var f1 = results[0];var f2 = results[1];var f3 = results[2];/*1. 在上面的例子中,每次循环,都创建了一个新的函数,然后,把创建的3个函数都添加到一个Array中返回了。2. 你可能认为调用f1(),f2()和f3()结果应该是1,4,9,但实际结果是*/f1(); // 16f2(); // 16f3(); // 16/*全部都是16!原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了4,因此最终结果为16。*/

注意: 返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

2.2 如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:

function count() {    var arr = [];    for (var i=1; i<=3; i++) {        arr.push((function (n) {            return function () {                return n * n;            }        })(i));    }    return arr;}var results = count();var f1 = results[0];var f2 = results[1];var f3 = results[2];f1(); // 1f2(); // 4f3(); // 9
原创粉丝点击