首页 > 代码库 > 闭包以及暴露接口---学习笔记

闭包以及暴露接口---学习笔记

闭包      :  函数可以访问它被创建时所处的上下文环境。---《JavaScript语言精粹》

产生原理:  JavaScript中没有块级作用域,只有函数作用域,函数中任何位置定义的参数和变量在函数内的任何地方都是可见的,在函数外不可见。

使用方法:  可以通过在函数内部创建局部变量,实现变量的私有化。(外部不可见)

注意事项:  内部函数访问外部函数的变量时访问的是实际变量(值为外部函数返回时变量的值)。

知识点   :  ①只要内部函数需要,外部函数中的变量不会在外部函数返回后销毁。(多了浪费内存)

                ②通过定义内部函数实现对内部变量信息的查询和修改,实现接口的暴露。

举个例子: 

var myObject = (function(){
    var value=http://www.mamicode.com/0;
    return {
        getValue: function(){
            return value;
        },
        setValue: function(v){
            if (typeof v === ‘number‘){
                 value = v;
            }
        }
    };        
}());    

这段代码得到一个myObject对象,包含两个方法,只有这两个方法可以获取或者修改value变量,没有其他办法可以访问到value变量。
这个value变量我们叫私有变量,这两个可以访问私有变量的共有方法就叫做特权方法

再举个例子:

//构造一个函数,本义是通过内部函数返回一个函数数组,数组中每一项都是一个函数
//数组项函数会返回当前的数组索引
//但是最后每一项的函数都会得到返回10 var eg2 = function(){ var i, result = new Array(); for(i=0; i<10; i += 1){ result[i] = function(){ return i; } } return result; };

为什么最后数组中每一项的函数都会返回10呢?因为内部的匿名函数访问的是变量i而不是函数创建时i的值,在for循环执行完后变量i中保存的值为10,最后外部函数返回的result数组中的每一项的函数中返回的变量i的值也就为10。

可以修改成这样解决:

//在for循环之外创建一个辅助函数,返回一个会返回传入的值的函数

var eg2 = function(){
    var result = new Array();                   
    
    var helper = function(e){
        return function(){
            return e;
        }
    };

    var i;
    for(i=0; i<10; i += 1){
        result[i] = helper(i);
    }

    return result;
};

在for循环中每次调用helper()函数时,传入变量i,由于函数参数是按值传递的,helper()就会将当前的变量i的值复制给局部变量e,然后返回一个会返回变量e的函数。

这里的变量e是每个数组项函数的局部变量,各自保存着各自不同的值。

闭包以及暴露接口---学习笔记