JavaScript闭包.pdfVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JavaScript闭包

JavaScript 闭包 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 我们来实现一个对 Array 的求和。通常情况下,求和的函数是这样定义的: function sum(arr) { return arr.reduce(function (x, y) { return x + y; }); } sum([1, 2, 3, 4, 5]); // 15 但是,如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?可以不返回求和的结果,而是返回求和的函数! function lazy_sum(arr) { var sum = function () { return arr.reduce(function (x, y) { return x + y; }); } return sum; } 当我们调用 lazy_sum()时,返回的并不是求和结果,而是求和函数: var f = lazy_sum([1, 2, 3, 4, 5]); // function sum() 调用函数 f 时,才真正计算求和的结果: 1 / 7 f(); // 15 在这个例子中,我们在函数 lazy_sum 中又定义了函数 sum ,并且,内部函数sum 可以引用外部函数 lazy_sum 的参 数和局部变量,当 lazy_sum 返回函数 sum 时,相关参数和变量都保存在返回的函数中,这种称为 “闭包(Closure )”的 程序结构拥有极大的威力。 请再注意一点,当我们调用 lazy_sum()时,每次调用都会返回一个新的函数,即使传入相同的参数: var f1 = lazy_sum([1, 2, 3, 4, 5]); var f2 = lazy_sum([1, 2, 3, 4, 5]); f1 === f2; // false f1()和 f2()的调用结果互不影响。 闭包 注意到返回的函数在其定义内部引用了局部变量 arr ,所以,当一个函数返回了一个函数后,其内部的局部变量还被新 函数引用,所以,闭包用起来简单,实现起来可不容易。 另一个需要注意的问题是,返回的函数并没有立刻执行,而是直到调用了 f()才执行。我们来看一个例子: function count() { var arr = []; for (var i=1; i=3; i++) { arr.push(function () { return i * i; }); } return arr; } 2 / 7 var results = count(); var f1 = results[0]; var f2 = results[1]; var f3 = results[2]; 在上面的例子中,每次循环,都创建了一个新的函数,然后,把创建的 3 个函数都添加到一个 Array 中返回了。 你可能认为调用 f1() ,f2()和 f3()结果应该是 1 ,4 ,9 ,但实际结果是: f1(); // 16 f2(); // 16 f3(); // 16 全部都是 16 !原因就在于返回的函数引用了变量i ,但它并非立刻执行。等到3 个函数都返回时,它们所引用的变量 i 已经 变成了 4 ,因此最终结果为16。 返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。 如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论

文档评论(0)

hhuiws1482 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档