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
阅读全文
0 0
- Js闭包 学习
- js闭包学习
- js闭包学习
- 学习JS闭包
- js闭包学习
- 学习JS闭包
- JS学习-闭包
- JS学习之----闭包
- JS闭包学习笔记
- js学习笔记-闭包
- js学习六-闭包
- JS学习(六) ----闭包
- 【great】js函数闭包学习贴
- JS 学习笔记--理解闭包
- 【js学习笔记-048】-- 闭包
- js学习(四)闭包
- js学习笔记之闭包
- 对js闭包的学习
- 合并单元格设置边框RegionUtil
- Redis各种数据结构性能数据对比和性能优化实践
- UrhoSharp WPF 开发入门
- java 反序列化 泛型
- C语言中.h和.c文件解析
- JS学习-闭包
- Linux服务器删除乱码文件和文件夹的方法
- Java 并发 竞态条件
- vue.js学习笔记2
- C和Cpp两大重点
- 解决报错:org/springframework/util/backoff/BackOff
- 函数模板二
- 乐观锁的一种实现方式——CAS
- dev ChartControl的最全使用方法 有横轴纵轴高亮显示