zoukankan      html  css  js  c++  java
  • 【笔记】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方式访问。与第二种类似。

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

  • 相关阅读:
    windbg vmware win7联机调试环境搭建
    c++回调实现
    导出函数,非导出函数,公开函数,非公开函数
    fileAPI 实现移动端 添加图片 预览缩略图(自己学习)
    Ztree _ 横向显示子节点、点击文字勾选、去除指定元素input的勾选状态
    仿微信公众平台“打标签”功能~~~
    踩坑之路_"var name = ' ';"_迷之BUG
    asp.net页面生命周期《转》
    2009年软件设计师考试大纲<软考>
    typedef用法总结。
  • 原文地址:https://www.cnblogs.com/floyd/p/1929269.html
Copyright © 2011-2022 走看看