闭包

swift懒加载(lazy load)VS OC懒加载

若如初见. 提交于 2021-02-01 11:38:54
懒加载可以让你不用关心变量的创建时机,等到真正使用的时候才去创建并且能保证在使用的时候已经初始化完毕,在一定程度上可以提高性能。 OC懒加载的原理: 重写变量的 getter 方法,在getter方法里判断变量 if 变量 == nil 则初始化变量 ,否则直接返回已经初始化完毕的变量,所以我们在调用懒加载的变量时 一定要使用 self.变量名(通过getter方法取值)。 话不多说先看一段OC懒加载实现: - (UICollectionViewFlowLayout *)flowLayout { if (!_flowLayout) { _flowLayout = [[UICollectionViewFlowLayout alloc] init]; _flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal; _flowLayout.minimumInteritemSpacing = 0; _flowLayout.minimumLineSpacing = 0; } return _flowLayout; } 我们在调用 self.flowLayout 的时候其实就是在调用变量的 getter 方法。 再看swift 中的懒加载实现: lazy var dataSource = Array<String

学习Javascript闭包(Closure)

删除回忆录丶 提交于 2020-12-12 03:54:15
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 下面就是我的学习笔记,对于Javascript初学者应该是很有用的。 一、变量的作用域 要理解闭包,首先必须理解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 二、如何从外部读取局部变量? 出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。 那就是在函数的内部,再定义一个函数。   function f1(){     var n=999;     function f2(){

js闭包

末鹿安然 提交于 2020-11-08 18:51:10
昨天接触到的一些问题让我对js闭包有了更深刻的理解。 现在我将问题的“上下文”详细说一下: 我要实现一个页面,让管理员对用户的权限进行管理,页面如下: 我要实现的效果是:当管理员单击下拉列表对用户的审核状态进行更改之后,将要修改的用户id和目前审核状态发送至后台,在后台处理完之后将信息反馈给前端,并进行一些提示,效果如图: 将提示信息显示在被处理用户信息同一行的一个单元格里面。 简单的思路:用jquery.post也好xmlhttprequest.open也好,当管理员对某一行的审核状态进行修改的时候,收集用户编号和修改后的审核状态,发送给后台,后台将处理的结果反馈回来,当前端得到后台的反馈之后,执行事先定义的回调函数,进行相应的提示操作: jQuery.post( url, {id:2,state:good}, function(){ //more cord…… } ); 问题的关键来了 ,从服务器反馈的信息可以知道要显示操作成功还是操作失败,但是,你要在表格里面显示提示信息,至少要知道提示信息要显示在第几行吧,然而后台并不是万能的,这么“前端”的问题,就不要为难后台了。 也许你会说,那就定义一个js的全局变量,记录管理员操作的记录是哪一行的,到时候后台反馈了就能直接定位显示了,好吧,这个暂时是解决了,假如,这个管理员的手很快,而后台的反应很慢,管理员处理了五六个

【JavaScript】关于eval( )

只愿长相守 提交于 2020-04-29 23:25:30
一、 eval() 动态执行时 使用当前函数的闭包。 var i = 100; function myFunc(ctx) { var i = 'test'; eval('var test = "hello."'); //test执行后为局部变量 } myFunc(); // 输出值100 alert(i); 二、eva l() 访问全局闭包: 1、IE内核环境下: 在 Internet Explorer 中的 JScript 的 eva l() 下,无 论是使用 window.eva l 调用,还是使用 window 作为传入的 this 实例,都不可能让 eva l() 得到访问全局闭包的能力。不过 JScript 中可以使用另一种方法来 得到完全相同的效果,即在 window.execScript() 方法中执行的代码“总是”在 全局闭包中执行。 // 本例建议在Internet Explorer 环境中测试 var i = 100; function myFunc() { window.execScript('i = "test"'); //execScript('i = "test"'); } myFunc(); // 输出值'test', 表明调用myFunc()时修改了全局闭包中的变量i alert(i); 而且, JScript 运行在名为 ActiveScript

Python——五分钟理解函数式编程与闭包

你说的曾经没有我的故事 提交于 2020-04-07 15:33:34
函数式编程 函数式编程这个概念我们可能或多或少都听说过,刚听说的时候不明觉厉,觉得这是一个非常黑科技的概念。但是实际上它的含义很朴实,但是延伸出来许多丰富的用法。 在早期编程语言还不是很多的时候,我们会将语言分成 高级语言与低级语言 。比如汇编语言,就是低级语言,几乎什么封装也没有,做一个赋值运算还需要我们手动调用寄存器。而高级语言则从这些面向机器的指令当中抽身出来,转而面向过程或者是对象。也就是说我们写代码面向的是一段计算过程或者是一个计算机当中抽象出来的对象。如果你学过面向对象,你会发现和面向过程相比,面向对象的抽象程度更高了一些,做了更加完善的封装。 在面向对象之后呢,我们还可以做什么封装和抽象呢?这就轮到了函数式编程。 函数我们都了解,就是我们定义的一段程序,它的输入和输出都是确定的。我们把一段函数写好,它可以在任何地方进行调用。既然函数这么好用,那么能不能 把函数也看成是一个变量进行返回和传参 呢? OK,这个就是函数式编程最直观的特点。也就是说我们写的一段函数也可以作为变量,既可以用来赋值,还可以用来传递,并且还能进行返回。这样一来,大大方便了我们的编码,但是这并不是有利无害的,相反它带来许多问题,最直观的问题就是由于函数传入的参数还可以是另一个函数,这会 导致函数的计算过程变得不可确定 ,许多超出我们预期的事情都有可能发生。 所以函数式编程是有利有弊的

JavaScript之闭包

梦想的初衷 提交于 2020-04-06 20:50:16
很多小伙伴估计都会面试遇到被问JavaScript的闭包是什么。 在我们谈闭包之前,我们先来谈谈JavaScript的垃圾回收机制。 JavaScript 具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。 而在 C 和 C++之类的语言中,开发人员的一项基本任务就是手工跟踪内存的使用情况,这是造成许多问 题的一个根源。在编写 JavaScript 程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无 用内存的回收完全实现了自动管理。 这种垃圾收集机制的原理其实很简单:找出那些不再继续使用的变量,然后释放其占用的内存。为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间),周期性地执行这一操作。 我们来分析一下函数中局部变量的正常生命周期。局部变量只在函数执行的过程中存在。而在这个过程中,会为局部变量在栈(或堆)内存上分配相应的空间,以便存储它们的值。然后在函数中使用这些变量,直至函数执行结束。此时,局部变量就没有存在的必要了,因此可以释放它们的内存以供将来使用。在这种情况下,很容易判断变量是否还有存在的必要;但并非所有情况下都这么容易就能得出结论。垃圾收集器必须跟踪哪个变量有用哪个变量没用,对于不再有用的变量打上标记,以备将来收回其占用的内存。用于标识无用变量的策略可能会因实现而异,但具体到浏览器中的实现,则通常有两个策略: 标记清除

go语言学习--go中闭包

大憨熊 提交于 2020-04-06 19:11:17
关于闭包有句话说的很好,闭包捕获的变量和常量是引用传递不是值传递。 Go语言支持匿名函数,即函数可以像普通变量一样被传递或使用。 使用方法如下: package main import ( "fmt" ) func main() { var v func(a int) int v = func(a int) int { return a * a } fmt.Println(v(6)) //两种写法 v1 := func(i int) int { return i * i } fmt.Println(v1(7)) }    GO语言的匿名函数就是闭包,以下是《GO语言编程》中对闭包的解释 基本概念 闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者 任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含 在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环 境(作用域)。 闭包的价值 闭包的价值在于可以作为函数对象或者匿名函数,对于类型系统而言,这意味着不仅要表示 数据还要表示代码。支持闭包的多数语言都将函数作为第一级对象,就是说这些函数可以存储到 变量中作为参数传递给其他函数,最重要的是能够被函数动态创建和返回。 一个函数和与其相关的引用环境,组合而成的实体: package main

jQuery源码分析随笔

帅比萌擦擦* 提交于 2020-04-06 07:16:38
一次在写jquery插件的经历,让自己发现了js水很深,自己很菜。然后慢慢发现js包括了原型、闭包、作用域等一些很常用的知识点。 首先jquery源码的主要结构 下面就是在做分析jquery源码时自己的一些备注 1 (function(window){ 2 var jQuery = function(select){ 3 //privatefunc(); 4 return new jQuery.fn.init(select); 5 //这边必须new一个对象(这时this指向init对象),不然return jQuery.fn.init(select);中this指向jQuery.fn,而jQuery.fn其实是个定义了很多方法的集合 6 } 7 8 jQuery.test = function(){//静态方法 9 console.log('call test method'); 10 } 11 12 var privatefunc = function (){//内部方法,不能再 外面调用,需要让外部调用及jquery的做法:window.privatefunc = privatefunc;这也是闭包 13 console.log(this) 14 console.log('call privatefunc method'); 15 } 16 17 jQuery.fn =

php (匿名函数和闭包)

≡放荡痞女 提交于 2020-04-06 03:51:38
一、什么是闭包 1、闭包和匿名函数在php5.3.0中两个php新特性,使用的也最多,这两个特性听起来很吓人, 其实很容易理解,这两个特性非常有用,每个php开发者都应该掌握。 2、闭包是指在创建时封装周围状态的函数,即便闭包所在的环境不存在了,闭包中封装的状态依然存在,这个概念很难理解 不过一单掌握了,将会对你的生活带来巨大的变化。 3、匿名函数其实就是没有名称的函数,匿名函数可以赋值给变量,还能像其他任何php对象那样传递,不过匿名函数仍然是 匿名函数,因此可以调用,还可以传入参数,匿名函数特别适合作为函数或方法的回调。 理论上讲,闭包和匿名函数是不同的概念,不过,php将其视作相同的概念,所以,我提到闭包时,指的也是匿名函数, 反之亦然。 4、php闭包和匿名函数使用的句法和普通函数相同,不过别被这一点迷惑了,闭包和匿名函数其实是伪装成函数的对象, 如果审查php闭包和匿名函数,会发现他们是Closure类的实例,闭包和字符串或整数一样,也是一等值类型。 二、创建一个闭包 $closure = function ($name) { return sprintf('Hello %s', $name); }; echo $closure('Yee Jason'); 输出 Hello Yee Jason. 之所以能调用$closure变量,是因为这个变量的值是一个闭包

Python的装饰器

ⅰ亾dé卋堺 提交于 2020-04-01 12:13:15
装饰器 1、装饰器的知识点储备 """ 1、*args,**kwargs:形参中的作用汇总:*args是元组形式,**kwargs字典形式 2、*args,**kwargs:实参中的作用展开: """ # 一、储备知识 # 需求:我们要把传给wrapper的参数,原封不动的转嫁给index函数 # 1、*args和**kwargs # def index(x,y): # print(x,y) # def wrapper(*args,**kwargs): # 形参中汇总: *args=(1,2,3,4,5),**kwargs={"a":1,"b":2} # index(*args,**kwargs) # 实参中展开: index(*(1,2,3,4,5),**{"a":1,"b":2}) # index(1,2,3,4,5,a=1,b=2) # wrapper(1,2,3,4,5,a=1,b=2) # 只要语法不错就可随意传,但是此处运行后会报错,因为index(x,y) # TypeError: index() got an unexpected keyword argument 'a' # wrapper(1,y=2) # wrapper(y=2,x=1) # 2、名称空间与作用域:名称空间的“嵌套”关系实在函数定义阶段,即检测语法的时候确定的。 # 名称空间的特点