当前位置:Gxlcms > JavaScript > js中闭包与立即执行函数的使用介绍(代码示例)

js中闭包与立即执行函数的使用介绍(代码示例)

时间:2021-07-01 10:21:17 帮助过:73人阅读

本篇文章给大家带来的内容是关于js中闭包与立即执行函数的使用介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

前言:最近在细读Javascript高级程序设计,对于我而言,中文版,书中很多地方翻译的差强人意,所以用自己所理解的,尝试解读下。如有纰漏或错误,会非常感谢您的指出。文中绝大部分内容引用自《JavaScript高级程序设计第三版》。

作用域链的这种配置机制引出了一个值得注意的副作用,即闭包只能取得包含任何变量的最后一个值。

  1. function createArray(){
  2. var result = new Array();
  3. for(var i = 0; i < 10; i++) {
  4. result[i] = function() {
  5. return i;
  6. }
  7. }
  8. return result;
  9. }

这个函数会返回一个函数数组。表面上看,似乎每个函数都应该返回自己的索引值,即位置0的函数返回0,位置1的函数返回1, 以此类推。

但实际上,每个函数都返回10,因为每个函数的作用域中都保存着createArray的活动对象,所以他们引用的都是同一个变量i。

当createArray()函数返回后,变量i的值是10,此时每个函数都引用着同一个变量i,所以i的值是10。

  1. // 代码执行过程
  2. createArray();
  3. /*
  4. createArray() {
  5. var result = new Array();
  6. var i; // 0,1,2,3,4,5,6,7,8,9,10
  7. for ( i = 0; i < 10 ; i ++) {
  8. result[i] = function() {
  9. return i;
  10. // 注意 函数的执行时机,你只有调用函数的时候,才会产生执行环境,沿着作用域链,找到活动对象
  11. // 这里有个闭包,还记得闭包的概念吗? 有权访问到另外一个函数作用域的变量的函数
  12. }
  13. }
  14. /*
  15. result[0] = function(){
  16. return i
  17. }
  18. result[1] = function(){
  19. return i
  20. }
  21. result[2] = function(){
  22. return i
  23. }
  24. ....
  25. */
  26. return result;
  27. }
  28. result = [function(){return i}, function(){return i}....];
  29. */
  30. createArray()[1](); // 10

那么如何让这个函数的行为符合我们的预期呢?

可以通过创建另一个匿名函数强制让闭包的行为符合预期,这里也应用了立即执行函数。

  1. //立即执行函数
  2. //我们平时写函数然后调用是这么写的。
  3. //声明函数,调用执行。
  4. function foo(){
  5. console.log("hi");
  6. }
  7. foo(); // "hi"
  8. //那么,我们可不可以声明调用写一块呢? 这就是申明函数立刻执行。
  9. //好像不可以,控制台报错
  10. function foo(){
  11. console.log("hi");
  12. }(); //Uncaught SyntaxError: Unexpected token )
  13. //那么如果用括号包裹呢?
  14. (function foo(){
  15. console.log("hi");
  16. }()); // "hi", 可以了。 这就是立即执行函数!

有了立即执行函数,就可以强制让闭包的行为符合我们的预期了。

  1. //改写代码
  2. function createArray() {
  3. var result = new Array();
  4. for( var i = 0; i < 10; i ++ ) {
  5. result[i] = (function(i) {
  6. return function(){
  7. return i;
  8. }
  9. }(i));
  10. }
  11. return result;
  12. }
  13. createArray()[0](); // 0
  14. createArray()[1](); // 1
  15. createArray()[2](); // 2
  16. // 这里不只有一种方法,其他方法在此不表。

以上就是js中闭包与立即执行函数的使用介绍(代码示例)的详细内容,更多请关注Gxl网其它相关文章!

人气教程排行