闭包

闭包

99封情书 提交于 2019-12-02 06:31:39
一、什么是闭包 简单来说,闭包就是可以访问另一个函数内部变量的函数。可以简单的理解成在一个函数内部定义的函数。 二、闭包的用处 一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。 三、闭包使用的注意事项 闭包的使用可能会造成内存泄漏、影响网页的性能。需要在退出函数之前,将不使用的局部变量删除。 四、例子 var name = "The Window";   var object = {     name : "My Object",     getNameFunc : function(){       return function(){         return this.name;       };     }   };   alert(object.getNameFunc()()); var name = "The Window";   var object = {     name : "My Object",     getNameFunc : function(){       var that = this;       return function(){         return that.name;       };     }   };   alert(object.getNameFunc()()); 来源: https:/

JS基础-函数

冷暖自知 提交于 2019-12-02 03:52:19
函数 JS运行分三步: 语法分析(通篇扫描是否有语法错误),预编译(发生在函数执行的前一刻),解释执行(一行行执行)。 预编译执行分五步: 一、创建AO对象(Activation Object 执行期上下文) 二、找形参和变量声明,将变量和形参名作为AO属性名,值为undefined. 变量声明提升(变量放到后面也不会报错,只是未定义类型)如:console.log(a);var a=10;结果undenfined; 三、将实参值和形参统一(传参) 四、在函数体里面找到函数声明{函数声明整体提升(相当于放到程序最前面)} 五、值赋予函数体,执行(声明函数和变量的部分直接不看了) 函数作用域[[scope]] 每个javascript函数都是一个对象,对象中有的属性可以访问,有的不能,这些属性仅供javascript引擎存取,如[[scope]]。 [[scope]]就是函数的作用域,其中存储了执行期上下文的集合。 执行期上下文 : 当函数执行时,会创建一个称为执行期上下文的内部对象(AO)。一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行期上下文都是独一无二的,所以多次调用一个函数会导致创建多个执行期上下文,当函数执行完毕,它所产生的执行上下文被销毁。 作用域链 [[scope]] 中所存储的执行期上下文对象的集合,这个集合呈链式链接

函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!

喜你入骨 提交于 2019-12-02 02:45:18
函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量! function f1(){     n=999; } f1(); alert(n); // 999 子函数可以一层一层读取到父元素的变量,反之不行。但假如我们需要得到函数内的局部变量,正常操作是:在函数的内部再定义一个函数,该函数称之为闭包,通过闭包,向上去读取父函数的局部变量。闭包的作用:读取局部变量;让局部变量的值始终保存在内存中。 function f1(){   var n=999;   function f2(){//闭包:定义在一个函数内部的函数/能够读取其他函数内部的变量的函数/将函数内部和函数外部链接起来的一座桥梁     alert(n); // 999   } } 来源: https://www.cnblogs.com/677a/p/11726729.html

Python基础滚固(七)蟒蛇最擅长的隐身与伪装-闭包 and 装饰器

拟墨画扇 提交于 2019-12-02 02:24:26
初闻此名,以为是哪个程序猿代码写久了,成了自闭症,把自己封闭起来包起来,觉得真逗。 闭包原来是指一类特殊的函数,这类函数是为了不修改其它函数而为了给其它函数增加某些功能而巧妙地设计出来的。 巧在哪里?妙在哪里?就让我们来看看以下场景吧。 公司小欧写了个函数如下: 1 def say(): 2 print("老板是个二货") 你猜对了,小欧准备删库跑路,最后折腾下这个死扣老板,只要程序执行了公司的重要函数就会显示“老板是个二货”,于是他想到了一个办法, 只需要在公司程序里用闭包给巧妙地把函数给伪装起来,神不知鬼不觉地就达到了目的。于是,小欧把以上代码悄悄修改了下。 1 def goodman(fun): #这个就是小欧写的闭包代码 2 def say(*args, **kwargs): 3 print("老板是个二货") 4 return fun(*args, **kwargs) 5 return say 6 7 8 def num_sum(a, b): #公司最重要的一个函数 9 return a + b 10 11 num_sum = goodman(num_sum)#将函数伪装起来 12 13 a = num_sum(1, 2) 14 print(a) 15 16 #运行结果: 17 老板是个二货 18 3 小欧的强项就是偷懒,他觉得每次敲键盘得累死,于是又用了装饰器来减轻他

Scala学习 -- 闭包

梦想与她 提交于 2019-12-01 23:06:25
闭包   闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。   闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数。   在 multiplier 中有两个变量:i 和 factor。其中的一个 i 是函数的形式参数,在 multiplier 函数被调用时,i 被赋予一个新的值。然而,factor不是形式参数,而是自由变量,考虑下面代码: var factor = 3 val multiplier = (i:Int) => i * factor   这里我们引入一个自由变量 factor,这个变量定义在函数外面。   这样定义的函数变量 multiplier 成为一个"闭包",因为它引用到函数外面定义的变量,定义这个函数的过程是将这个自由变量捕获而构成一个封闭的函数。 object Test { def main(args: Array[String]) { println( "muliplier(1) value = " + multiplier(1) ) println( "muliplier(2) value = " + multiplier(2) ) } var factor = 3 val multiplier = (i:Int) => i * factor }    来源: https://www.cnblogs.com/Lyh1997

关于闭包的一点理解

≡放荡痞女 提交于 2019-12-01 22:49:19
  看了很多闭包的文章,谈谈我对闭包的理解,单纯的看闭包就是方法里面返回方法用于获取内部变量的值。如果只是这样的话我直接返回内部的局部变量就好了吗?   所以提到第二点保持状态,单纯的说一个方法调用之后,里面的一切状态就重新还原到原来的样子,也就是这个方法被内存回收了。但是如果我一个外部变量指向这个返回的方法,这段程序就不会被内存回收,这里面的局部变量就保留了状态!! 来源: https://www.cnblogs.com/AndyLin/p/11719654.html

js闭包的理解

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-01 22:23:51
本文来源:MDN https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures   闭包:最开始的解释就是说函数套函数,嵌套(内部)函数对其容器(外部)函数是私有的。它自身就形成了一个闭包。 function makeFunc() { var name = "Mozilla"; function displayName() { alert(name); } return displayName; } var myFunc = makeFunc(); myFunc();    makeFunc() 创建了一个局部变量 name 和一个名为 displayName() 的函数。 displayName() 是定义在 makeFunc() 里的内部函数,仅在该函数体内可被获取;重点:闭包可以让你从内部函数访问外部函数作用域,所以说makeFunc()就是一个 闭包。 在例子中, myFunc 是执行 makeFunc 时创建的 displayName 函数实例的引用(因为makeFunc() return displayName),而 displayName 实例仍可访问其词法作用域(makeFunc函数的作用域--根据声明变量的位置来确定该变量可被访问的位置 )中的变量,即可以访问到 name 。由此,当 myFunc

闭包1

不打扰是莪最后的温柔 提交于 2019-12-01 22:14:39
<body> <!-- 1。如何产生闭包? *当一个嵌套的内部(子)函数引用嵌套的外部(父)函数的变量(函数)时,就产生了闭包 2.闭包到底是什么? 使用chrome调试查看 理解一:闭包是嵌套的内部函数(绝大部分人) 理解二:包含被引用变量(函数)的对象(极少数人) 注意:闭包存在于嵌套的内部函数中 3.产生闭包的条件? 函数嵌套 内部函数引用了外部函数的数据(变量/函数) --> <script> function fn1(){ var a =2 var b = '22'//闭包里面没有b    如果是var fn = function(){ //这样就不产生闭包      console.log(a)      } function fn2(){ //执行函数定义才能产生闭包,也就是一定要执行外部函数,执行了函数定义才会产生变量,不一定要执行内部函数(fn2) console.log(a) //闭包里面有a } fn2() } fn1() </script> </body> 执行函数定义才能产生闭包,也就是一定要执行外部函数,执行了函数定义才会产生变量,不一定要执行内部函数(fn2) 来源: https://www.cnblogs.com/lucy-xyy/p/11718731.html

python 闭包

时光毁灭记忆、已成空白 提交于 2019-12-01 20:34:13
#不是闭包def f1(): a = 10 def f2(): a = 20 print(a) print(a) -- 10 f2() -- 20 print(a) --10 f1() ___ 闭包 def f1(): a = 10 def f2(): c = 20 * a return f2 f = f1() print(f.__closure__) origin=0 def factory(pos): def go(step): nonlocal pos new_pos = pos + step pos = new_pos return new_pos return go t = factory(origin) print(t(2)) --2 print(t(3)) --5 print(t(5)) --10print(origin)--0 来源: https://www.cnblogs.com/angdh/p/11717096.html