通俗的讲一下 闭包

闭包是指有权访问另外一个函数做用域中的变量的函数。建立闭包的常见方式,就是在一个函数内部建立另外一个函数。闭包

常见闭包出现的问题函数

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。

最后,不少人觉得闭包指的是一个函数被一个函数返回,其实不是。它指的是 有权访问另外一个函数做用域中的变量的函数,跟是否是被 返不返回并无关系。咱们通常让其返回一个函数,是但愿这个闭包能按照咱们的预期进行。

相关文章
相关标签/搜索