闭包

JavaScript的匿名函数与自执行

谁说胖子不能爱 提交于 2020-02-20 00:58:24
函数 是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途。匿名函数:就是没有函数名的函数。 函数的定义,大致可分为三种方式: 第一种:这也是最常规的一种 1 function double(x){ 2 return 2 * x; 3 } 第二种:这种方法使用了Function构造函数,把参数列表和函数体都作为字符串,很不方便,不建议使用。 1 var double = new Function('x', 'return 2 * x;'); 第三种: 1 var double = function(x) { return 2* x; } 注意“=”右边的函数就是一个匿名函数,创造完毕函数后,又将该函数赋给了变量double。 匿名函数的创建 第一种方式:就是上面所讲的定义square函数,这也是最常用的方式之一。 第二种方式: 1 (function(x, y){ 2 alert(x + y); 3 })(2, 3); 这里创建了一个匿名函数(在第一个括号内),第二个括号用于调用该匿名函数,并传入参数。括号是表达式,是表达式就有返回值,所以可以在后面加一对括号让它们执行. 自执行的匿名函数 1. 什么是自执行的匿名函数? 它是指形如这样的函数: (function {// code})(); 2. 疑问 为什么(function {// code})()

1.3.6 详解build.gradle文件——Android第一行代码(第二版)笔记

限于喜欢 提交于 2020-02-19 14:29:09
不同于Eclipse,Android Studio是采用Gradle来构建项目的。Gradle是一个非常先进的项目构建工具,它使用了一种基于Groovy的领域特定语言(DSL)来声明项目设置。 首先看项目最外层目录下的build.gradle文件,代码如下所示: ~~~ buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.1.3' } } allprojects { repositories { google() jcenter() } } task clean(type: Delete) { delete rootProject.buildDir } ~~~ 这些代码是自动生成的, 首先两处,repositories的闭包中都声明了jcenter()这个配置。jcenter是一个代码托管仓库。 接下来,dependencies闭包中使用classpath声明一个Gradle插件。因为Gradle并不是专门为构建Android项目而开发的,因此如果我们要想使用它来构建Android项目,则需要声明 com.android.tools.build:gradle:3.1.3 这个插件。其中最后面的部分是版本号。

1.3.6 详解build.gradle文件——Android第一行代码(第二版)笔记

≡放荡痞女 提交于 2020-02-19 13:42:17
不同于Eclipse,Android Studio是采用Gradle来构建项目的。Gradle是一个非常先进的项目构建工具,它使用了一种基于Groovy的领域特定语言(DSL)来声明项目设置。首先看项目最外层目录下的build.gradle文件,代码如下所示:~~~buildscript {repositories {google()jcenter()}dependencies {classpath 'com.android.tools.build:gradle:3.1.3'}}allprojects {repositories {google()jcenter()}}task clean(type: Delete) {delete rootProject.buildDir}~~~这些代码是自动生成的,首先两处,repositories的闭包中都声明了jcenter()这个配置。jcenter是一个代码托管仓库。接下来,dependencies闭包中使用classpath声明一个Gradle插件。因为Gradle并不是专门为构建Android项目而开发的,因此如果我们要想使用它来构建Android项目,则需要声明 com.android.tools.build:gradle:3.1.3 这个插件。其中最后面的部分是版本号。 下面我们来看app目录下的build.gradle文件

Scala—— 26.闭包

喜你入骨 提交于 2020-02-19 03:06:57
闭包就是一个函数和与其相关的引用环境组合的一个整体(实体)。 def minusxy ( x : Int ) = ( y : Int ) = > x - y //f 函数就是闭包. val f = minusxy ( 20 ) println ( "f(1)=" + f ( 1 ) ) // 19 println ( "f(2)=" + f ( 2 ) ) // 18 传入的变量不是x而是y,x是minsxy的函数的参数。 (y: Int) => x - y 返回的是一个匿名函数,因为该函数引用到函数外的x,那么该函数和x整体形成一个闭包。如:这里val f = minusxy(20)的f函数就是闭包。可以这样理解, 返回函数是一个对象,而x就是该对象的一个字段,它们共同形成一个闭包 。当多次调用f时(可以理解多次调用闭包),发现使用的是同一个x,所以x不变。 在使用闭包时,主要搞清楚返回函数引用了函数外的哪些变量,因为它们会组合成一个整体(实体),形成一个闭包。 ```java val f = makeSuffix ( ".jpg" ) println ( f ( "dog.jpg" ) ) // dog.jpg println ( f ( "cat" ) ) // cat.jpg } def makeSuffix ( suffix : String ) = { /

python中的偏函数和变量作用域

China☆狼群 提交于 2020-02-18 07:37:21
1.偏函数 当一个函数有大量的参数时,调用会变得非常麻烦,我们可以通过偏函数,固定一些参数,简化函数的调用。例如, def addaddminus ( num1 , num2 , num3 , num4 ) : return num1 + num2 + num3 - num4 print ( addaddminus ( 1 , 2 , 3 , 4 ) ) 执行结果如下, 2 这个addaddminus()函数包含有四个参数,下面我们使用偏函数将参数num1和参数num2固定为1和2,并重新计算。 import functools addaddminus = functools . partial ( addaddminus , 1 , 2 ) print ( addaddminus ( 3 , 4 ) ) 执行结果如下, 2 我们也可以固定参数num2和参数num3,如下, import functools addaddminus = functools . partial ( addaddminus , num2 = 2 , num3 = 3 ) print ( addaddminus ( num1 = 1 , num4 = 4 ) ) 注意,这时我们传参时需要通过关键字传参。 执行结果如下, 2 2.变量的作用域 程序中的变量并不是在任意的位置都可以随意访问,在哪

JavaScript 中的函数与作用域

自闭症网瘾萝莉.ら 提交于 2020-02-17 08:53:02
一、声明提升 大部分编程语言都是先声明变量再使用,但在 JavaScript 中,有些不一样: console . log ( username ) ; // undefined var username = 'JavaScript' ; 上面的代码会正常输出 undefined 而不是报错 Uncaught ReferenceError: a is not defined 。就是因为声明提升( declaration hoisting )。 那为什么输出的是 undefined 而不是 JavaScript 呢? 因为 JavaScript 只有变量的声明会提升,初始化不会。 再看段代码: a = 2 ; var a ; console . log ( a ) ; // 2 同样是因为变量提升的原因,所以输出的是 2 而不是 undefined 。 JavaScript 引擎会在解释 JavaScript 代码之前首先对其进行编译。编译阶段中的一部分工作就是找到所有的声明,并用合适的作用域将它们关联起来。因此,包括变量和函数(我们后面会再次提到)在内的所有声明都会在任何代码被执行前首先被处理。 JavaScript 在读到 var a = 2; 时,会将其看成两个声明: var a; 和 a = 2; 。第一个定义声明是在编译阶段进行的;第二个赋值声明会被留在原地等待执行阶段。

Python 中的装饰器

情到浓时终转凉″ 提交于 2020-02-17 07:37:12
说到装饰器是我们每个学Python人中的心痛。 1.闭包 学习装饰器首先我们先学习闭包: 闭包条件    1 在一个外函数中定义了一个内函数。 2 内函数里使用了外函数的临时变量。 3 并且外函数的返回值是内函数的引用(即函数名)。 闭包的定义 闭包的概念就是当我们在函数内定义一个函数时,这个内部函数使用了外部函数的临时变量,且外部函数的返回值是内部函数的引用时,我们称之为闭包。 出现的背景 一般情况下,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。 闭包的基本结构: def func1(msg): #外函数 name="xiao" def inner(): #内函数 na = name # 使用外函数的变量 nb = msg print(inner.__closure__) print(inner.__closure__[0].cell_contents) print(inner.__closure__[1].cell_contents) return inner #返回内函数的引用 f=func1(123) f() #判断函数是不是闭包函数用__closure__方法 如果是闭包函数就是返回一个元组包含

python-正则表达式

徘徊边缘 提交于 2020-02-16 13:42:29
正则表达式为高级的文本模式匹配、抽取、与/或文本形式的搜索和替换功能提供了基础。 简单地说,正则表达式(简称为 regex)是一些由字符和特殊符号组成的字符串,它们描述了 模式的重复或者表述多个字符,于是正则表达式能按照某种模式匹配一系列有相似特征的字符串。 一、使用择一匹配符号匹配多个正则表达式模式 表示择一匹配的管道符号(|),也就是键盘上的竖线,表示一个“从多个模式中选择其 一”的操作。它用于分割不同的正则表达式。有了这个符号,就能够增强正则表达式的灵活性,使得正则表达式能够匹配多个字符串 而不仅仅只是一个字符串。择一匹配有时候也称作并(union)或者逻辑或(logical OR)。 二、匹配任意单个字符 点号或者句点(.)符号匹配除了换行符\n 以外的任何字符,无论字母、 数字、空格(并不包括“\n”换行符)、可打印字符、不可打印字符,还是一个符号,使用点 号都能够匹配它们。然而要显式匹配一个句点符号本身,必须使用反斜线转义句点符号的功能,例如“\.”。 三、从字符串起始或者结尾或者单词边界匹配 四、创建字符集 五、限定范围和否定 括号中两个符号中间用连字符 (-)连接,用于指定一个字符的范围;例如,A-Z、a-z 或者 0-9 分别用于表示大写字母、小 写字母和数值数字。 六、使用闭包操作符实现存在性和频数匹配 星号或者星号操作符(*)将匹配其左边的正则表达式

Python—函数进阶

戏子无情 提交于 2020-02-15 23:53:41
楔子 假如有一个函数,实现返回两个数中的较大值: 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解释器开始执行之后,就在内存中开辟了一个空间 每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来。 但是 当遇到函数定义的时候解释器只是象征性的将函数名读入内存 ,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心。

10个JavaScript难点

瘦欲@ 提交于 2020-02-14 05:42:37
[转] 10个JavaScript难点 2017年8月4日 • Web前端 • 暂无评论 译者按: 能够读懂这篇博客的JavaScript开发者,运气不会太差… 原文: 10 JavaScript concepts every Node.js programmer must master 译者: Fundebug 为了保证可读性,本文采用意译而非直译,并且对示例代码进行了大量修改。另外,本文版权归原作者所有,翻译仅用于学习。 1. 立即执行函数 立即执行函数 ,即Immediately Invoked Function Expression (IIFE),正如它的名字,就是创建函数的同时立即执行。它没有绑定任何事件,也无需等待任何异步操作: (function() { // 代码 // ... })(); function(){…} 是一个匿名函数,包围它的一对括号将其转换为一个表达式,紧跟其后的一对括号调用了这个函数。 立即执行函数 也可以理解为立即调用一个匿名函数。 立即执行函数 最常见的应用场景就是:将var变量的作用域限制于你们函数内,这样可以避免命名冲突。 2. 闭包 对于闭包(closure),当外部函数返回之后,内部函数依然可以访问外部函数的变量。 function f1() { var N = 0; // N是f1函数的局部变量 function f2() //