闭包

理解闭包

↘锁芯ラ 提交于 2019-11-27 01:28:22
闭包的使用场景:想把一些行为封装起来,这些行为依赖当前上下文的数据,而你不想重建一个方法,并且传递参数。这时候可以使用闭包。在C#中,闭包主要是通过匿名方法来体现的。 闭包的优点: 1、直接传递上下文数据,不需要传递。 2、延迟初始化器 闭包的缺点: 破坏了封装性,也就是说,使用了本不属于自己的东西。 转载于:https://www.cnblogs.com/nzbbody/archive/2012/01/12/2320834.html 来源: https://blog.csdn.net/weixin_30906185/article/details/99234367

闭包

非 Y 不嫁゛ 提交于 2019-11-26 23:27:06
闭包:函数f1中有函数f2或对象obj2。里面的函数f2或对象obj2可以调用外面的函数f1定义的变量或数据。此时形成闭包。 function f1(){ var num=10; function f2(){ console.log(num); //10 ,这里函数f2可以调用其外部的函数f1定义的num,此时形成闭包。 } } 来源: https://www.cnblogs.com/huihuihero/p/11335166.html

什么是闭包?

放肆的年华 提交于 2019-11-26 21:04:44
什么是闭包? 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 下面就是我的学习笔记,对于Javascript初学者应该是很有用的。 摘自 https://www.cnblogs.com/huanghuali/p/9851453.html 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处, 就在于函数内部可以直接读取全局变量。 var n=999;   function f1(){     alert(n);   }   f1(); // 999 另一方面, 在函数外部自然无法读取函数内的局部变量。 function f1(){     var n=999;   }   alert(n); // error 这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量! function f1(){     n=999;   }   f1();   alert(n); // 999 二、如何从外部读取局部变量? 出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。 那就是在函数的内部

函数进阶

我的梦境 提交于 2019-11-26 20:26:21
楔子 假如有一个函数,实现返回两个数中的较大值: def my_max(x,y): m = x if x>y else y return mbigger = my_max(10,20)print(bigger) 之前是不是我告诉你们要把结果return回来你们就照做了?可是你们有没有想过,我们为什么要把结果返回?如果我们不返回m,直接在程序中打印,行不行? 来看结果: >>> def my_max(x,y): ... m = x if x>y else y ... >>> my_max(10,20) >>> print(m) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'm' is not defined 报错了!错误是“name 'm' is not defined”。变量m没有被定义。。。为啥?我明明定义了呀! 在这里我们首先回忆一下python代码运行的时候遇到函数是怎么做的。 从python解释器开始执行之后,就在内存中开辟了一个空间 每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来。 但是 当遇到函数定义的时候解释器只是象征性的将函数名读入内存 ,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心。

闭包以及面向对象

三世轮回 提交于 2019-11-26 20:05:45
1.什么是闭包? 以我个人的理解,简单来说就是函数套函数 官方的是:闭包是函数和声明该函数的词法环境的组合 2.闭包的作用 (1) 可以读取函数内部的变量 (2) 可以把变量始终保存在内存中 3.闭包的写法 (1) 一个函数(即外部函数)里面包含另一个函数(即内部函数),并且return返回这个内部函数, 然后内部函数在定义内部函数之外的作用域被调用,这时的内部函数就是一个闭包了。 (2) 内部函数引用了外部函数的变量,这个变量不会被销毁,因为闭包需要这个变量, 所以通过闭包可以访问闭包保存的变量 4.闭包的缺点 (1) 因为闭包的变量保存在内存中,内存泄漏,对内存的消耗很大,所以不要滥用闭包 5.闭包常用的地方: (1) es5 for循环事件监听 (2)函数里使用了定时器 (3)封装许多高级的功能集 6.闭包的是怎样实现的 (1)这就相当于我们构造了一个闭包的环境 (2)第一次调用内层循环 (3)第二次调用内层循环 (4)循环结束 6.什么是面向对象 面向对象是一种思维模式 比较准确的说:面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象 封装:把相关信息存储在对象在的能力 聚集:就是把一个对象存储在另一个对象的能力 继承:由一个类(或多个类)得来的属性和方法的能力 多态:编写能以多种方法运行的函数或方法的能力 7.构造函数 构造函数

Python函数默认参数的陷阱

时光总嘲笑我的痴心妄想 提交于 2019-11-26 19:59:56
默认参数实际上只有一个值 代码1 def func(l = 1): l += 1 print(l) func() func() func() 代码2 lst = [] def func(a,l = lst): l.append(a) print(l)func(1) # [1] func(2,[]) # [2] func(3) # [1,3]变量是变量,值是值 变量的名字和有多少个值没有对应关系 我们在看修改的时候:要看修改的是哪一个对应的值而不是变量 def func(l = []): # 在函数定义的时候 创建了个[] pass # 对于默认参数来说,[]只定义一次 def func2(a = 0): a += 1 a = a + 1 = 0 + 1 = 1 局部变量 会随着这个函数的调用而消失 print(a)func2()func2() 闭包的概念和代码 闭包: 内部函数使用了外部函数的变量,内部函数就是一个闭包 代码 def func(*args): sum_num = 0 for num in args: sum_num += num def inner(): return sum_num return inner inner = func(1,2,3,4) inner() 转载于:https://www.cnblogs.com/jayxuan/p/10742352

闭包+原型对象

别来无恙 提交于 2019-11-26 19:50:40
首先我们要了解闭包的含义: 闭包即重用变量,又保护变量不被污染的一种机制, //闭包 var local = '变量'; //局部变量 function arr(){ //arr为函数 console.log(local) //可访问到local变量 } 简单来说:闭包就是: 「函数」和「函数内部能访问到的变量」(也叫环境)的总和。 在讲原型链之前先了解什么是原型: proto 叫做内部原型,prototype 叫做构造器原型 原型:在JavaScript中,一共有两种类型的值,原始值和对象值.每个对象都有一个内部属性[[prototype]],我们通常称之为原型    原型链: 下面附带一张图 工作原理是:当我们有一个构造函数Student , 实例化一个stu对象,当我们需要用到stu中的方法时,就会去proto属性(“父亲”)内去寻找有没有这个方法,从而对象的proto属性指向其构造函数的prototype属性。若在上一层没有找到stu方法,则会继续向“爷爷”辈的属性去找,也就是去Object中去找。 原型链:   1.保存着所有对象的成员(方法和属性)   2.控制对象访问成员的使用顺序,优先使用自己的,自己没有才沿着原型链向父级查找   3.原型链的顶端是Object.prototype A.验证原型对象:   1.如果一个对象的原型对象是Array.prototype

gof-命令模式入门解读

谁说胖子不能爱 提交于 2019-11-26 17:46:46
命令模式:将回调方法对象化 应用场景:规范回调方式,调用方式 比如MVC中的观察者回调皆为命令对象 谈一点小经验: 在设计命令时将命令中参数尽可能的放在构造中传入 避免出现 void Execute(params T)这种尴尬局面 在一些动态语言中可以使用的闭包的 一个最外层的upvalue直接当作一个命令对象使用 但是当闭包内方法过于复杂时还是封装为具体的命令对象比较简洁 有些不用记录状态的命令可以实例一次无限复用 比如推箱子 方向移动一条命令不需要记录状态 而有些具有撤销操作的命令需要记录这条命令的状态 方便做撤销操作 public interface ICommand { void Execute(); void Execute(PlayerActor actor); //<-尽量不要出现在命令中传参这种局面 命令中枢非常难运维 } public class HideCommand : ICommand { HideCommand(GameObject obj,Transform pos) {//<-一条命令的参数在这里传入 } public void Execute() { throw new System.NotImplementedException(); } public void Execute(PlayerActor actor)//<-错误示范 { throw

能看懂这10个JavaScript难点的程序员运气不会太差…

我怕爱的太早我们不能终老 提交于 2019-11-26 16:49:26
为了保证可读性,本文采用意译而非直译,并且对示例代码进行了大量修改。另外,本文版权归原作者所有,翻译仅用于学习。 1. 立即执行函数 立即执行函数 ,即Immediately Invoked Function Expression (IIFE),正如它的名字,就是创建函数的同时立即执行。它没有绑定任何事件,也无需等待任何异步操作: (function() { // 代码 // ... })(); **function(){…}**是一个匿名函数,包围它的一对括号将其转换为一个表达式,紧跟其后的一对括号调用了这个函数。 立即执行函数 也可以理解为立即调用一个匿名函数。 立即执行函数 最常见的应用场景就是:将var变量的作用域限制于你们函数内,这样可以避免命名冲突。 2. 闭包 对于闭包(closure),当外部函数返回之后,内部函数依然可以访问外部函数的变量。 function f1() { var N = 0; // N是f1函数的局部变量 function f2() // f2是f1函数的内部函数,是闭包 { N += 1; // 内部函数f2中使用了外部函数f1中的变量N console.log(N); } return f2; } var result = f1(); result(); // 输出1 result(); // 输出2 result(); // 输出3

JavaScript闭包

China☆狼群 提交于 2019-11-26 16:47:06
闭包:定义在一个函数内部的函数被引用到了外部 本质上,闭包是将函数内部和外部连接起来的桥梁。 通常,函数的作用域和它的所有变量都会在函数执行结束后被销毁,但是,在创建了一个闭包以后,这个函数的作用域会一直保存到闭包不存在为止。 这样说可能不理解,让我们看一个经典闭包案例 function test(){ var arr[]; for (var i = 0 ;i < 10; i++) {arr[i] = function () {document.write(i+" ");} } return arr; } var myArr = test(); for (var j = 0;j < 10;j++) { myArr[j](); } ​ 按照常理应该输出0~9吧,实则不然,居然会输出10个10! 因为函数赋值给数组,和外部函数test形成了闭包。 大家可能会有疑问,为什么不是一一对应的呢?i = 0 时,arr[0] =function() {document.write(0+" ")};这个时候应该打印0啊。 这样想是不对的,我来粗略讲解一下这个过程。 1.首先我们从函数调用执行时开始讲起,因为test函数定义过程所需要用的GO我们用不到。 2.在代码块下面,我们使用var myArr =test();调用函数test,在函数执行的前一刻我们进行预编译,函数test会生成一个AO