码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-12-29 17:25:13      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:return   使用方法   执行   创建   笔记   div   上下文环境   for   位置   

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

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

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

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

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

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

举个例子: 

var myObject = (function(){
    var value=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是每个数组项函数的局部变量,各自保存着各自不同的值。

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

标签:return   使用方法   执行   创建   笔记   div   上下文环境   for   位置   

原文地址:http://www.cnblogs.com/Mr-thirteen/p/6233464.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!