闭包

闭包2——闭包与变量

不羁的心 提交于 2019-12-17 01:33:56
作用域链的这种配置机制引出了一个值得注意的副作用,即闭包只能取得包含函数中任何变量的最后一个值。而闭包所保存的是整个变量对象,而不是某个特殊的变量。 1 function createFunctions(){ 2 var result = new Array(); 3 for (var i=0;i<10;i++){ 4 result[i] = function(){ 5 return i; 6 } 7 } 8 return result; 9 } 这个函数会返回一个函数数组。表面上看,似乎每个函数都应该返自己的索引值。但实际上,每个函数都会返回10。因为每个函数的作用域链中都保存着createFunctions()函数的活动对象,所以它们引用的都是同一个变量i。当createFunctions()函数返回后,变量i的值是10,此时每个函数都引用着保存变量i的同一个变量对象,所以在每个函数内部i的值都是10.但是,我们可以通过创建另一个匿名函数强制让闭包的行为符合预期,如下: 1 function createFunctions(){ 2 var result = new Array(); 3 for (var i=0;i<10;i++){ 4 result[i] = function(num){ 5 return function(){ 6 return num; 7 }; 8 }

js学习:函数

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-16 23:45:24
概述 函数的声明 JavaScript 有三种声明函数的方法 function 命令 function命令声明的代码区块,就是一个函数。function命令后面是函数名,函数名后面是一对圆括号,里面是传入函数的参数。函数体放在大括号里面。 这叫做函数的声明(Function Declaration)。 function print(s) { console.log(s); } 函数表达式 除了用function命令声明函数,还可以采用变量赋值的写法。 var print = function(s) { console.log(s); }; 这种写法将一个匿名函数赋值给变量。这时,这个匿名函数又称函数表达式(Function Expression),因为赋值语句的等号右侧只能放表达式。 采用函数表达式声明函数时,function命令后面不带有函数名。如果加上函数名,该函数名只在函数体内部有效,在函数体外部无效。 var print = function x(){ console.log(typeof x); }; // ReferenceError: x is not defined print() // function 上面代码在函数表达式中,加入了函数名x。这个x只在函数体内部可用,指代函数表达式本身,其他地方都不可用。这种写法的用处有两个,一是可以在函数体内部调用自身

js闭包中的this(匿名函数中的this指向的是windows)

安稳与你 提交于 2019-12-16 22:05:19
1.普通函数中的this指向的是对象,匿名函数中的this指向的是windows,和全局变量一样 2.让匿名函数中的this指向对象的两种方法 可以使用对象冒充强制改变this:call()、apply() 将this赋值给一个变量,闭包可以访问这个变量 一、this问题 匿名函数的执行环境具有全局性,因此其 this对象通常指向window (当然,在通过call()或者apply()改变函数执行环境的情况下,this就会指向其他对象) 为什么匿名函数没有取得其包含作用域(或外部作用域)的this对象呢? 每个函数在被调用时都会自动取得两个特殊变量:this和arguments。内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。 二、解决方法 (1)把外部作用域中的this对象保存在一个闭包能够访问到的变量里,就可以让闭包访问该对象了。 2 可以使用对象冒充强制改变this:call()、apply() 来源: https://www.cnblogs.com/psxiao/p/11378681.html

Javascript Closure

最后都变了- 提交于 2019-12-16 19:33:34
一、变量的作用域 要理解闭包,首先必须理解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); // 999     }   } 在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行

JS闭包

血红的双手。 提交于 2019-12-15 20:07:56
函数与对其状态即 词法环境 ( lexical environment )的引用共同构成 闭包 ( closure )。也就是说,闭包可以让你从内部函数访问外部函数作用域。在JavaScript,函数在每次创建时生成闭包。 词法作用域 请看下面的代码: function init() { var name = "Mozilla"; // name 是一个被 init 创建的局部变量 function displayName() { // displayName() 是内部函数,一个闭包 alert(name); // 使用了父函数中声明的变量 } displayName(); } init(); init() 创建了一个局部变量 name 和一个名为 displayName() 的函数。 displayName() 是定义在 init() 里的内部函数,仅在该函数体内可被获取。请注意, displayName() 内没有自己的局部变量,然而它可以访问到外部函数的变量,所以 displayName() 可以使用父函数 init() 中声明的变量 name 。 运行该代码后发现, displayName() 内的 alert() 语句显示出了 name 变量的值(该变量在父函数中声明)。这个 词法作用域 的例子描述了引擎是如何解析嵌套函数中的变量的。词法(lexical)一词表明

go 函数使用,闭包

心已入冬 提交于 2019-12-15 12:13:35
函数类型也是一等的数据类型。这是什么意思呢? 这意味着函数不但可以用于封装代码、分割功能、解耦逻辑,还可以化身为普通的值,在其他函数间传递、赋予变量、做类型判断和转换等等,就像切片和字典的值那样。 而更深层次的含义就是:函数值可以由此成为能够被随意传播的独立逻辑组件(或者说功能模块)。 对于函数类型来说,它是一种对一组输入、输出进行模板化的重要工具,它比接口类型更加轻巧、灵活,它的值也借此变成了可被热替换的逻辑组件。 我先声明了一个函数类型,名叫Printer,注意这里的写法,在类型声明的名称右边的是func关键字,我们由此就可知道这是一个函数类型的声明。 nc右边的就是这个函数类型的参数列表和结果列表。其中,参数列表必须由圆括号包裹,而只要结果列表中只有一个结果声明,并且没有为它命名,我们就可以省略掉外围的圆括号。 书写函数签名的方式与函数声明的是一致的。 只是紧挨在参数列表左边的不是函数名称,而是关键字func。这里函数名称和func互换了一下位置而已 函数的签名其实就是函数的参数列表和结果列表的统称,它定义了可用来鉴别不同函数的那些特征,同时也定义了我们与函数交互的方式。 注意,各个参数和结果的名称不能算作函数签名的一部分,甚至对于结果声明来说,没有名称都可以。只要两个函数的参数列表和结果列表中的元素顺序及其类型是一致的,我们就可以说它们是一样的函数

js闭包

老子叫甜甜 提交于 2019-12-14 23:56:03
一、闭包的理解 我理解的函数的作用域链是向外扩张的,即函数中所能访问的变量按照层级关系是由内向外的,每个函数最先能访问的变量是它本身所在的环境的变量,其次下一个能访问的变量就是包含当前的函数所在的环境,然后是下下个包含环境。这样一层层的找下去,直到找到全局执行环境为止。如下图: 在这里,当执行到func1函数的时候,会报错找不到c,是因为c是在func2函数里面定义的,func1函数只能向外寻找c的值,不能向内访问到func2函数的变量,所以找不到c。闭包就可以解决这一问题。 2、什么是闭包? 闭包在JavaScript高级程序设计(第3版)中是这样描述: 闭包是指有权访问另一个函数作用域中的变量的函数 。 我个人的理解更多是 : 是指外部函数有权访问内部函数作用域中的变量的函数 ,(不知道这样理解对不对,先这么记一下,以后要是有不同的理解再做更新) 3、闭包的作用 1. 可以在函数的外部访问到函数内部的局部变量。 2.使用函数内部的变量在函数执行完后, 仍然存活在内存中(延长了局部变量的生命周期),不会随着函数的结束而自动销毁。 4、闭包产生的条件 1.函数嵌套2.内部函数引用了外部函数的数据(变量/函数)3.执行外部函数 1 function fn1() { 2 //此时闭包就已经产生了(函数提升, 内部函数对象已经创建了) 3 var a = 2 4 function fn2

swift 深入理解Swift的闭包

人盡茶涼 提交于 2019-12-14 16:43:12
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 我们可用swift的闭包来定义变量的值。 先来一个简单的例子大家先感受感受。 定义一个字符串的变量的方法: 直接赋值 var str="JobDeer" 还可以用闭包的方式定义: var str:String={ return "JobDeer" }() 闭包还可以这么定义,省略了等号和括号: var str:String{ return "JobDeer" } 闭包中可以定义get方法。 var str:String{ get{ return "JobDeer" } } 既然用可以用get方法, 那么能用set方法吗? 可以的: var str:String{ get{ return "JobDeer" } set{ println("set ok") } } 我们在用 willSet 和didSet方法试一试, 注意 用 willSet /didSet不能和get/set共同使用的, 在使用willSet /didSet时,变量需要有初始值。 所以这么使用: var str:String="JobDeer"{ willSet{ println("newValue:\(newValue)") } didSet{ println("oldValue:\(oldValue)") } } str="new

闭包和装饰器使用

偶尔善良 提交于 2019-12-13 23:08:04
闭包 闭包可以保存外部函数内的变量,不会随着外部函数调用完而销毁,优点是是无需重新定义,缺点需要内存无法及时释放 #下面展示了一个自定义闭包 def fun_out ( a ) : def fun_inner ( b ) : #a = 3 #这里定义的a与外部无关,相当于重新定义了一个变量 #可以使用nonlocal a = 3 声明使用外部变量 result = a + b print ( result ) return fun_inner f = fun_out ( 1 ) f ( 2 ) 装饰器 就是给已有函数增加额外功能的函数,它本质上就是一个闭包函数,将外部函数传的参数改为额外的函数 # 添加一个登录验证的功能 def check ( fn ) : def inner ( ) : print ( "请先登录...." ) fn ( ) return inner def comment ( ) : print ( "发表评论" ) # 使用装饰器来装饰函数 comment = check ( comment ) comment ( ) 糖写法 # 添加一个登录验证的功能 def check ( fn ) : print ( "装饰器函数执行了" ) def inner ( ) : print ( "请先登录...." ) fn ( ) return inner #

小白怎么入门Web前端行业 JS基础知识点有哪些

落花浮王杯 提交于 2019-12-13 21:27:19
小白怎么入门Web前端行业?JS基础知识点有哪些?Web前端工程师是当前各大企业都比较稀缺的人才,薪资待遇和就业前景都很不错。不论是专业还是非专业,有基础亦或是无基础,都想通过学习Web前端实现高薪就业。不过,学习要一步一个脚印,不能一口吃一个胖子,所有的实战经验都是基于理论而积累形成,下面就给大家梳理汇总一下JS相关的基础知识点。 1、执行环境:有时也叫环境,是JavaScript中最为重要的一个概念,执行环境定义了变量或函数有权访问的其他数据。 2、变量对象:每一个执行环境都有一个与之关联的变量对象,环境中定义的所有的变量和函数都保存在这个的对象中。 3、作用域链:代码在环境中执行时,会创建变量对象的作用域链,保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,始终是当前执行代码所在环境的变量对象。 4、活动对象:如果当前执行环境是函数,则将活动对象作为变量对象。 5、可执行代码:1)全局代码:例如加载外部的JS文件或者本地标签内的代码,全局代码不包括 function体内的代码;2)函数代码:function体内的代码;3)eval代码:eval()函数计算某个字符串,并执行其中的JS代码,比如eval("alert('hello world')")。 6、执行上下文栈:在一个JS程序中,必定会产生多个执行上下文,JS引擎会以栈的方式来处理它们