• 【笔记】JavaScript闭包的常见使用


    自己总结出来的使用方法。。。。Mark一下!

    1。循环绑定

    No Use:

    1 var lists = document.getElementsByTagName(‘li’);
    2 for(var i=0;i<lists.length;i<l;i++){
    3     lists[i].onclick=function(){alert(i);};
    4 }
    5 

    结果:点击每一个li,都是弹出lists.length的值。

    原因:onclick事件中的i值只是引用,最后循环执行完了,i = lists.length。

    Use:

    1 var lists = document.getElementsByTagName(‘li’);
    2 for(var i=0;i<lists.length;i<l;i++){
    3     lists[i].onclick=function(i){return function(){alert(i);}}(i);
    4 }
    5 

    结果:点击每一个li,弹出对应li的编号i值。

    原因:将i值传递进内部的函数中,此时函数已经执行了,所以,i这个值就是当时的值。

    2。配置对应访问

    No Use:

    function getType(type){
    var list = {
        ‘a’:’配置一’,
        ‘b’:’配置二’,
        ‘c’:’配置三’
    }
    return list[type];
    }

    结果:返回需要的配置值。

    分析:每次调用都需要重新定义list变量以及赋值;

     Use:

     1 var getType = function(){
     2     var list = {
     3         ‘a’:’配置一’,
     4         ‘b’:’配置二’,
     5         ‘c’:’配置三’
     6 };
     7 return function(type){
     8     return list[type];
     9 };
    10 }();
    11 

    结果:返回需要配置值。

    分析:只需要定义与赋值一次list变量。

    3。封装类

    No Use:

    1 function ClassA(name){
    2     this.name = name;
    3     this.getName = function(){
    4          return this.name;
    5     }
    6 }

    结果:正常定义需要类。

     Use:

     1 var ClassA = function(){
     2     function init(name){
     3         this.name = name;
     4         this.getName = function(){
     5         return this.name;
     6                 }
     7         }
     8 return init;
     9 }();
    10 

    结果:更进一步封装类。看起来优雅些。

    4。自执行,避免全局变量污染

    No Use:

    1 var a = ‘1’;
    2 var b = ‘2’;
    3 alert(a+b);
    4 

    结果:弹出12。

    分析:多了两个全局变量a与b。

    Use:

    1 ~function(){
    2      var a = ‘1’;
    3      var b = ‘2’;
    4      alert(a+b);
    5 }();
    6 
     

    结果:弹出12。

    分析:函数执行完,变量a与b消失,不存在全局变量。

    5。将json对象的公用函数私有化

    No Use:

    1 var data = {
    2     getA:function(){return ‘A’},
    3     getB:function(){return ‘B’},
    4     p_get:function(){return this.getA()+this.getB();}
    5 }
    6 data.p_get();
    7 
     

    结果:返回’AB’。

    分析:getA与getB方法,只是提供给p_get方法使用,属于私有方法,不应该变成公用方法,data.getA()也能访问得到。

    Use:

     1 var data = function(){
     2     function getA(){return ‘A’};
     3     function getB(){return ‘B’};
     4     var json = {
     5         p_get:function(){return getA()+getB();}
     6         }
     7 return json;
     8 }();
     9 data.p_get();
    10 
     

    结果:返回’AB’;

    分析:getA与getB只能在内部访问,无法通过data.getA方式访问。与第二种类似。

    暂时就想到那么多,最后一句,可以的话,还是尽量少用闭包。

  • 相关阅读:
    文件高级应用和函数基础
    字符编码,文件操作
    数据类型分类,深浅拷贝
    容器数据类型内置方法
    数字类型和字符串类型内置方法
    流程控制循环
    python 运算和流程控制
    【MySQL】SQL教程
    【MySQL】数据库字段类型
    【java】HashSet
  • 原文地址:https://www.cnblogs.com/floyd/p/1929269.html
Copyright © 2020-2023  润新知