zoukankan      html  css  js  c++  java
  • 有关闭包的理解

    1.闭包:其实就是一个函数,这个函数能够访问另一个作用域中的变量。创建闭包的常见方式,就是在一个函数内部创建(或引用)另一个函数,这另一个函数就是闭包。
    function myFun(i)
       {
            var value1=function1(i);
            var value2=function2(i);
            if(value1<value2)
              {
                  return -1;
              }
              else if(value1>value2)
              {
                  return 1;
              }
              else 
              {
                  return 0;
              }   
       }
     
    函数function1(i)和function2(i)就是闭包。
     
    2.闭包的副作用:闭包只能取得包含函数中任何变量的最后一个值。
    function createFunctions()
         {
             var result=new Array();
              for(var i=0;i<10;i++)
              {
                 result[i]=function()
                 {
                    return i;
                 };
              }
              return result;
         }

         var funcs=createFunctions();
         for(var i=0;i<funcs.length;i++)
         {
            document.write(funcs[i]()+"<br />");
         }
    所以输出的值全是10;
     
    通过创建另一个匿名函数强制让闭包符合预期:
         function createFunctions()
         {
             var result=new Array();
              for(var i=0;i<10;i++)
              {
                 result[i]=function(num)
                 {
                    return function()
                     {
                        return num;
                     };
                 }(i);
              }
              return result;
         }

         var funcs=createFunctions();
         for(var i=0;i<funcs.length;i++)
         {
            document.write(funcs[i]()+"<br />");
         }
     
    3.有关闭包中使用this对象:this 对象是在运行时基于函数的执行环境时绑定的,在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。
    var name="Ths Window";
    var object={
        name:"My Object",
         getNameFunc:function()
         {
            return function()
            {
              return this.name;
            }
         }
    }
    alert(object.getNameFunc()());
     
    当跳出了object.getNameFunc()时,this.name就变成了window.name.所以输出的是“Ths Window", 如果想让对象内部的变量name
    可以在this是object的时候把this.name保存在某个在某个变量中,如下:
    var name="Ths Window";
    var object={
        name:"My Object",
         getNameFunc:function()
         {
             var local=this;
            return function()
            {
               
              return  local.name;
            }
         }
    }
    alert(object.getNameFunc()());
  • 相关阅读:
    关于maven+springmvc+mybits搭建的框架clean,build后错误:org.apache.ibatis.binding.BindingException的处理
    mvn从下载安装到纯命令行创建第一个mvn程序(编码,编译,测试,安装,打包)全过程细致分解
    C++程序中调用bat
    E2034 Cannot convert 'wchar_t *' to 'const char *' bcb2010
    C++ calling a dll.
    如果你不是为了表现
    cdecl、stdcall、fastcall函数调用约定区别
    桌面便签
    在新的工控机上调试程序注意事项
    listview1.items.itemdata:stream read error
  • 原文地址:https://www.cnblogs.com/lorking/p/2613174.html
Copyright © 2011-2022 走看看