闭包与立即执行函数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <script> var arr = []; for (var i = 0; i < 5; i++) { arr[i] = function() { console.log(i); } } // 我们想依次输出数组对应的数值,有两种实现方式 arr[2](); arr[5](); </script> </body> </html>方式一
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <script> var arr = []; for (var i = 0; i < 5; i++) { arr[i] = function() { console.log(i); } // 在for循环内部调用,因为函数在哪调用就在哪执行 arr[i](); } </script> </body> </html>第二种方式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <script> var arr = []; for (var i = 0; i < 5; i++) { arr[i] = (function outer(i) { // 闭包可以保存变量 return function inner() { console.log(i) } })(i) } console.log(arr[i]) </script> </body> </html>第二种方式使用闭包和立即执行函数,首先外部函数立即执行返回给变量arr[i]一个函数体,此时函数体没有调用所以没有执行里面的i,for循环了5次,生成了5个闭包,而每次闭包都保存了立即执行函数里的参数,所以即使我们在循环结束去调用函数 也是依次输出的每次保存的值