闭包是指有权访问另外一个函数做用域中的变量的函数。建立闭包的常见方式,就是在一个函数内部建立另外一个函数。闭包
常见闭包出现的问题函数
function createFunction(){ var result = new Array(); for(var i=0; i<10; i++){ result[i] = function(){ return i; } } console.log('i 的值:'+ i) return result; }
createFunction() 返回的结果 spa
当咱们调用 createFunction()[1]();时返回的是code
事实上arr的每一项调用的结果都是10图片
为何呢?作用域
事实上你在调用每一项时,实际上是这样的it
function childFunction(){ var i = 10; return function(){ return i; } }
这个 i 来自它的父级做用域io
或者咱们这么说,return i; 中的 i 跟 for循环中的 i 实际上是不同的。由于此时的 console
函数并无调用,而当你调用的时候,它才去做用域链搜索 i 的值。而此时 i = 10;for循环
咱们尝试在返回以前更改 i =9999;
获得证实。
那么要怎样才能让它返回咱们预期的那样呢?
咱们只要把 result [i] 中的 i 当作参数传进函数
result[i] = (function(num){ return function(){ return num; } })(i)
这一段代码到底发生了什么?咱们让 外层 的函数传入参数并当即执行,此时里面的 num 等于传入的参数, 等到最内层函数调用的时候,它会拿到外层的num。
最后,不少人觉得闭包指的是一个函数被一个函数返回,其实不是。它指的是 有权访问另外一个函数做用域中的变量的函数,跟是否是被 返不返回并无关系。咱们通常让其返回一个函数,是但愿这个闭包能按照咱们的预期进行。