闭包

关于Qomo 2.0 beta1的发布

空扰寡人 提交于 2019-12-01 18:43:05
注意:此前对Qomo V2 beta1做过一次发布,但因为该版本文件已经丢失,且未在sourceforge中发布, 因此此次发布仍然使用beta1的名称。并将更新sourceforge中的文件。 一、Qomolangma 2.0 Beta1 参见如下发布说明: Qomo 2.0 beta1 发布说明及新功能 此外,今次发布的更新列表包括: 添加工具函数toEtor()和类Dict() Class()支持将匿名函数注册为匿名类 在内核方面的一些优化代码 HttpGetMachine()作了一些小的修改 二、有关toEtor() 参见/Framework/TestCase/T_Etor.html。 所谓Etor,是指一种小型的执行器,可以处理代码、标志等。 Etor()本质上是对eval()的封装,但它具有一些有趣的特性。例如我们在PHP中可以有一种类似如下的语法: str = "abcd${value}ghi" 在这个例子中,如果我们试图将 ${value} 替换为当前代码环境中的变量value的值,那么就可以使用etor来做。 Etor是一个字符串,它可以通过toEtor()来得到,也可以通过eval()来执行。重要的是,我们在String中扩展了一个etor()方法,通过这个方法可以自动应用Etor,以替换字符串中的特定标志。 Etor可以存取闭包外或从闭包外去存取闭包内部的数据

前端性能优化的三大类处理方式

我只是一个虾纸丫 提交于 2019-12-01 17:22:56
1 . 减少 HTTP 的请求次数和传输报文的大小 -CSS SPRITE(雪碧图、图片精灵)技术 - 使用字体图标(ICON FONT)或者 SVG 等矢量图; 可以减少 HTTP 请求次数或者减少请求内容的大小 ,使图片渲染的更快:因为他们是基于代码渲染的,而对于位图(png/jpg/gif)是需要先把图片编码再渲染 ,可以避免图片失真变形 ; 可以使用 webp 格式图片,这种格式要小一些(但要保证服务器端支持这种格式的请求处理) - 图片懒加载(延迟加载)技术 ; 第一次加载页面的时候不去请求真实的图片,将默认背景图替代真实图片进行加载,以提高第一次渲染页面的速度; 当页面加载完,把出现在用户视野区域中的图片做真实加载,没有出现在用户页面时的资源先不加载(可以节约流量,也能减少对服务器的请求压力); 数据我们也尽可能分批加载(不要一次请求过多的数据,例如分页技术) - 音视频文件取消预加载(preload='none'),这样可以增加第一次渲染页面的速度,当需要播放的时候再加载 - 客户端和服务器端的数据传输尽可能基于 JSON 格式完成,XML 格式比 JSON 格式要大一些(还可以基于二进制编码或者文件流格式,这种格式比文件传输好很多) - 把页面中的 CSS/JS/图片等文件进行合并压缩:争取 CSS 和 JS 都只导入一个:基于 webpack 可以压缩

v8 引擎的内存

非 Y 不嫁゛ 提交于 2019-12-01 17:22:39
一、nodejs查看内容使用情况: process.memoryUsage()    单位为 Btye 转化函数: var format = function(bytes) { return (bytes/1024/1024).toFixed(2)+'MB'; };    heapTotal 和 heapUsed 代表 V8 的内存使用情况。 external 代表 V8 管理的,绑定到 Javascript 的 C++ 对象的内存使用情况。 rss 是驻留集大小, 是给这个进程分配了多少物理内存(占总分配内存的一部分),这些物理内存中包含堆、代码段、以及栈。 对象、字符串、闭包等存于堆内存。 变量存于栈内存,实际的 JavaScript 源代码存于代码段内存。 二、浏览器的查看 window.performance.memory    三、内存的分布 新生代内存,是采用循环回收,即: 从 from 取出 活着 的变量,放入 to , 清空 from 内存,然后 取出 to 里面 活着 的变量,存入 from , 清空 to 内存, 如此交替执行。 老生代内存,当新生代内存占用超过 一定 百分比, 开始存入老生代。 老生代内存是每次标记出活着的变量,删掉死去的, 然后整理内存,将碎片合并。 四、内存的使用 1、尽量不声明全局变量 2、声明了全局变量,当不再使用的时候,置为

python的闭包操作

北战南征 提交于 2019-12-01 16:55:09
调用外函数的时候,只是存了闭包函数给flast列表,这个闭包函数并不是一个结果,个人理解而是存的是当前的环境,比如第一次循环当前的环境就是i=0,第二次循环,当前的环境就是i=1,等。 然后,真正的计算是在最后f(2)的时候,给x赋了具体的值,才计算出结果。 这些大部分还是我debug和设置标志看运算过程步骤,加上一些知识自己摸索出来的。 PS:刚学到这,这部分还是太难理解了,在网上看了很长时间的学习资料,才有点懂,写下了自己的一些理解,不一定对,欢迎指正。 来源: https://www.cnblogs.com/wdgray/p/11694301.html

转:学习Javascript闭包(Closure)

拜拜、爱过 提交于 2019-12-01 16:15:51
作者: 阮一峰 闭包(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(){       alert(n);

Java 8 新特性:Lambda 表达式

≯℡__Kan透↙ 提交于 2019-12-01 16:10:22
Lambda 表达式 文 | 莫若吻 ( 注:此文乃个人查找资料然后学习总结的,若有不对的地方,请大家指出,非常感谢!另外,知识都有串联,如果某一处看不懂,就先接着往下看,之后再回头看不明白的地方就会恍然大悟了。 ) 一. 为什么 Java 需要 Lambda 表达式? 如果忽视注解(Annotations)、泛型(Generics)等特性,自 Java 语言诞生时起,它的变化并不大。Java 一直都致力维护其对象至上的特征,在使用过JavaScript 之类的函数式语言之后,Java 如何强调其面向对象的本质,以及源码层的数据类型如何严格变得更加清晰可感。其实,函数对Java 而言并不重要,在 Java 的世界里,函数无法独立存在。 然而,在函数式编程语言中,函数是一等公民,它们可以独立存在,你可以将其赋值给一个变量,或将他们当做参数传给其他函数。JavaScript 是最典型的函数式编程语言。函数式语言提供了一种强大的功能——闭包,相比于传统的编程方法有很多优势,闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。Java 现在提供的最接近闭包的概念便是 Lambda 表达式,虽然闭包与 Lambda 表达式之间存在显著差别,但至少 Lambda 表达式是闭包很好的替代者。 Lambda 表达式为 Java 添加了缺失的函数式编程特点

tp-路由定义笔记(2)

人盡茶涼 提交于 2019-12-01 15:44:15
  路由分组:可以把相同前缀的路由合并成一个分组,好处就是提高路由匹配的效率(手册上说的,原因等后面补吧,现在也不知道为啥)。例如同一条路由根据参数和访问方式的变化可以访问不同的控制器和方法(每条单独设置也可以达到这个效果,但我感觉这样设置更整齐一些,更何况还说可以提高效率)。比如访问url:module/controller/action/name/Bob,通过设置路由分组之后,post和get可以访问到不同方法。或者更改传参module/controller/action/name/123(之前是字符串,现在是数字)。   大致分支: 1 function group($name, $routes, $option = [], $pattern = []) 2 { 3 if (! empty($name)) { 4 if ($routes instanceof \Closure) { 5 //转下文中 2.name加闭包 6 } else { 7 //.....转下文中 1.简单案例 8 } 9 } elseif ($routes instanceof \Closure) { 10 //转下文中 3.只闭包 11 } else { 12 //转下文中 4.其他 13 } 14 }   1.简单案例:例如下面两个路由可以合并成一个分组 1 'blog/:id' => ['Blog

JavaScript 中的闭包

僤鯓⒐⒋嵵緔 提交于 2019-12-01 15:29:54
闭包的例子 应用 常见错误之循环闭包 封装 总结 本文为慕课网 JavaScript深入浅出 JavaScript 中的闭包笔记。 闭包的例子 function outer() { var localVal = 30; return localVal; } console.log(outer()); //30 function outer2() { var localVal = 30; return function() { return localVal; }; } var func = outer2(); console.log(func()); //30 对于第一个普通的函数,在执行过之后,它的局部变量就可以被释放。 对于第二个函数, localVal 是不能被释放的。因为调用 outer2() 后,返回的是匿名函数,匿名函数可以访问外部的 outer2() 中的局部变量,并返回了这个局部变量 localVal。当 outer2() 赋值给 func 后,再次调用 func() ,仍能访问到局部变量 localVal 。这种情况就是闭包。 应用 所谓闭包就是:子函数可以使用父函数中的局部变量。 ! function() { var localData = "localData here"; document.addEventListener('click', function

学习Javascript闭包(Closure)

南楼画角 提交于 2019-12-01 12:37:37
原文链接 原文作者: 阮一峰 本文为学习笔记;相较原文可能会有部分注释及修改 转载请注明出处 闭包(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(){

JavaScript闭包解决的问题

南笙酒味 提交于 2019-12-01 10:03:28
一、引入 我们假如想实现一个计数器的功能,我们可能会像下面这样写。 var count = 0; function increase(){ return ++count ; } 这样从功能角度上看是可以的,但是从设计角度看是不优雅的,很明显的一个问题就是向外暴露了内部成员,外部能够直接操作它,可能会导致计数错误。而且还会污染全局命名空间。 在像C/C++、这种语言中,我们可以用局部静态变量来实现。如下 unsigned int increase() { static unsigned int count = 0; return ++count; } 在JavaScript中,是没有静态变量这个概念的,像下面一样。 function add(){ static var count = 0; return ++count; } 这样使用会报错。 那么有没有一种可行的方式,能够像使用静态变量一样呢?答案就是闭包。 二、闭包 在Javascript中有嵌套函数这个概念,我们可以用嵌套函数来实现局部静态变量的功能。那么什么是嵌套函数? 1.嵌套函数 字面上意思,我们可以在函数中嵌套函数。如下所示 function host() { var count = 0; var increase = function () { return ++count; }; console.log