闭包

闭包与作用域链,思考题目

余生长醉 提交于 2019-11-27 12:18:56
var nAdd; var t = function() { var n = 99; nAdd = function() { n++; } var t2 = function() { console.log(n) } return t2; }; var a1 = t(); var a2 = t(); nAdd(); a1(); //99 a2(); //100 当执行 var a1 = t()的时候,变量 nAdd 被赋值为一个函数 ,这个函数是function (){n++},我们命名这个匿名函数为 fn1 吧。接着执行 var a = t()的时候,变量 nAdd 又被重写了,这个函数跟以前的函数长得一模一样,也是function (){n++},但是这已经是一个新的函数了,我们就命名为 fn2 吧。 所以当执行 nAdd 函数,我们执行的是其实是 fn2,而不是 fn1,我们更改的是 a2 形成的闭包里的 n 的值,并没有更改 a1 形成的闭包里的 n 的值。所以 a1() 的结果为 99 ,a2()的结果为 100。 来源: https://www.cnblogs.com/Jamie1032797633/p/11362498.html

05. 函数高级-闭包

蹲街弑〆低调 提交于 2019-11-27 10:35:22
01. JavaScript的运行机制 (1)所有同步任务都在主线程上执行,形成一个执行栈。 (2)主线程之外,还有一个“任务队列”,只要异步任务有了运行结果,就在“任务队列”之中放置一个事件。 (3)一旦“执行栈”中的所有同步任务执行完毕了,系统就会读取“任务队列”,看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。 (4)主线程不断重复上面的三步。(事件循环) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>00_引入</title> </head> <body> <div id="btn01"> <button>测试11</button> <button>测试12</button> <button>测试13</button> </div> <hr/> <div id="btn02"> <button>测试21</button> <button>测试22</button> <button>测试23</button> </div> <hr/> <div id="btn03"> <button>测试31</button> <button>测试32</button> <button>测试33</button> </div> <!-- 需求: 点击某个按钮, 提示

js闭包

主宰稳场 提交于 2019-11-27 09:45:11
已下是自己阅读文档js高级程序设计后的知识点,在此记录,以便于之后温习 闭包 1.闭包是指有权访问另一个函数作用域中变量的函数。常见方式:在另一个函数中创建另一个函数 2.当函数被调用,会创建一个执行环境和作用域链,并将作用域链赋给一个内部属性[[Scope]]。然后用this,arguments,和其他命名属性来做活动对象。外部函数的活动对象位于第二位,再外层的位于第三位,直到作用域链的最外层为全局。 3.作用域链的实质是指向变量对象的指针列表,它只引用但不实际包含变量对象。 4.一般情况下,函数执行完会销毁活动对象,但是有闭包的话,在函数执行完毕后,但是闭包还在使用该函数的活动对象,那么活动对象不会被销毁,将继续保存在内存中,直到闭包代码执行完毕,销毁。 5.闭包与变量 1).闭包的副作用:闭包只能取包含函数中任何变量的最后一个值。但是我们可与创建另一个匿名函数强制让闭包欣慰符合预期 6.this对象 闭包中的this对象通常指向window var name="this is window"; var obj={ name:"this is obj", getName:function(){ return function(){ return this.name; }; } } alert(obj.getName()());//this is window 函数调用时

孟欣 - 何为闭包

牧云@^-^@ 提交于 2019-11-27 09:40:43
闭包 一提到闭包,就会想到函数套函数; 官方解释: 闭包是指一个函数有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部 理解: A,B俩函数,A是爹,B是儿子,A罩着B 因为遵循Javascript语言特有的"链式作用域"结构,子会一级一级地向上找父的所有变量。 A的钱给B花,A是啥家庭,有多少钱,B看的是清清楚楚,明明白白。 B攒私房钱,偷攒了多少钱,A也不知道 !!! 闭包的用途: 可以读取函数内部的变量 让这些变量的值始终保持在内存中。 注意坑: 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。 解决方法是,在退出函数之前,将不使用的局部变量全部删除。 易造成内存泄漏,解决办法,用完就删。 闭包的操作是在父函数外部改变 父函数内部变量的值。所以,如果你把父函数当作对象使用,把闭包当作它的公用方法,把内部变量当作它的私有属性,这时一定要小心,不要随便改变父函数内部变量的值。 你用行,你别改。(吵吵行,别动手,动手小心我额你钱)。 注:函数内再嵌套函数 内部函数可以引用外层的参数和变量 参数和变量不会被垃圾回收机制回收 来源: CSDN 作者: 孟欣的博客 链接:

闭包!!!

痴心易碎 提交于 2019-11-27 08:45:13
闭包的定义: 嵌套函数,外部函数的变量被内部函数调用 先走一段代码: def func(): a = 1 def new_func(): print(a) return new_func new = func() print(new) new() #打印: <function func.<locals>.new_func at 0x000001DC5B9EB948> 1 解读起来就是: 当外部函数func调用时,外部函数的变量a并没有在内部函数调用,因为内部函数并没有被调动起来;而外部函数被调用执行时,a已经在存放局部名称空间的内存中存放起来,走到内部函数的函数名时,函数名同样和a一起被存放在局部名称空间,指向的内存地址存放的是内部函数的函数名,这个时候我们直接在外部函数返回内部函数的内存地址,即变量名,再以一个新的对象接收,那么我们每次使用新的对象名加上()就可以直接将内部函数的内存地址存放的a调用起来,而不用每次都需要调用外部函数,因为每一次调用会使得内存会一直新建、释放内存。闭包的好处就是保存函数的状态信息,使函数的局部变量信息依然可以保存下来这是整个闭包执行完后的流程图 我们再看一下正常的函数调用是什么样的: def func(): a = 1 def new_func(): print(a) new_func() func() #打印 1 由于在全局名称空间当中

跨域与闭包

前提是你 提交于 2019-11-27 08:18:02
跨域 当违背同源策略时就会发生跨域问题 常见的解决跨域问题的方法有jsonp , cors , 服务器代理。。。 在前端里使用jsonp需要进行如下设置// 创建script标签 var script = document.createElement('script'); // 设置回调函数 function getData(data){ //数据请求回来会被触发的函数 console.log(data); } // 设置script 的src属性,设置请求地址 script.src = 'http://localhost:3000?callback=getData'; //假设get请求,url里保存地址 // 让script生效 document.body.appendChild(script); 闭包 来源: https://www.cnblogs.com/BR-Tao/p/11354082.html

闭包的实现原理和作用、以及内存泄露

一世执手 提交于 2019-11-27 07:05:31
一、闭包的实现原理和作用,可以列举几个开发中闭包的实际应用 1、 闭包的概念 :指有权访问另一个函数作用域中的变量的函数,一般情况就是在一个函数中包含另一个函数。 2、 闭包的作用 :访问函数内部变量、保持函数在环境中一直存在,不会被垃圾回收机制处理 因为函数内部声明 的变量是局部的,只能在函数内部访问到,但是函数外部的变量是对函数内部可见的,这就是作用域链的特点了。 子级可以向父级查找变量,逐级查找,找到为止 因此我们可以在函数内部再创建一个函数,这样对内部的函数来说,外层函数的变量都是可见的,然后我们就可以访问到他的变量了。 < script > function bar ( ) { //外层函数声明的变量 var value = 1 ; function foo ( ) { console . log ( value ) ; } return foo ( ) ; } ; var bar2 = bar ; //实际上bar()函数并没有因为执行完就被垃圾回收机制处理掉 //这就是闭包的作用,调用bar()函数,就会执行里面的foo函数,foo这时就会访问到外层的变量 bar2 ( ) ; < / script > foo()包含bar()内部作用域的闭包,使得该作用域能够一直存活,不会被垃圾回收机制处理掉,这就是闭包的作用,以供foo()在任何时间进行引用。 3、 闭包的优点:

js中的“闭包”

吃可爱长大的小学妹 提交于 2019-11-27 06:29:31
姓名:闭包 官方概念: 闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。 ( ⊙o⊙ )!!!这个也太尼玛官方了撒,作为菜鸟的我根本无法理解它想表达个什么意思!但是作为一只好奇的菜鸟又很想知道“闭包”到底是个什么东西!所以最终找到了传说中的“度娘”帮忙!还算有了一点小小的理解! 个人见解:在函数体内定义另外的方法函数,而这个方法函数被函数以外的变量引用,这时就形成了闭包! 可能这样的理解也太抽象了,并不是那么简单易懂!实例吧: 1 <script type="text/javascript"> 2 3 function A(){ 4 var S=0 ; 5 function B(){ 6 alert(++ S); 7 } 8 return B; 9 } 10 var C= A(); 11 C(); 12 </script> 上面这一段代码就创建了一个闭包,因为当函数执行到var C=A();时,表面上看C指向的是A函数,而实际上C所指向的函数是B函数,所以再执行到C()的时候就会输出2;这样的话B函数就被A函数以外的变量引用了,根据个人见解,创建了一个闭包! 当我在小小的了解了什么时候闭包后也顺便看了哈闭包的用途,据说 闭包的用途 主要有两点 : 1、可以读取函数内部的变量 2、让这些变量始终保持在内存中 1 <script

047 闭包函数

南楼画角 提交于 2019-11-27 05:49:14
闭包函数 闭包指的是:函数内部函数对外部作用域而非全局作用域的引用。 我们之前学习函数的参数的时候,我们给函数传参数是从函数的外部传参的 def func(a): print(a) func(2) 现在闭包给我们提供了另外一种给传参数的思路 把函数以及变量一起包起来,也就是封装起来,下次需要用的时候可以直接拿来用 其实也就是函数里面嵌套着一个函数 闭包函数: 传参的另外一种方式, 参数与函数包在一起返回出去 闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,该函数无论在何处调用,优先使用自己外层包裹的作用域。 def func(a): def add(): print(a) return add res = func(2) res() 查看闭包的元素,就是查看闭包函数里面封装的有哪些东西 print(F"f.__closure__[0].cell_contents: {f.__closure__[0].cell_contents}") 爬取网页的闭包函数 import requests def func(url) def receive() r = requests.get(url) print(r.text) return receive baidu = func('https://www.baidu.com/') # baidu = func函数名

随机面试题

空扰寡人 提交于 2019-11-27 05:34:19
1.截取字符串abcdefg里面的cde   str.substring(2,5) str.substr(2,3) str.slice(2,3) 2.清除浮动的几种方式,各自优缺点   (1: 使用空标签清除浮动clear:both。     原理:添加一个空div,利用css提高的clear:both清除浮动,让父级div能自动获取到高度     优点: 通俗易懂,容易掌握     缺点: 会添加很多无意义的空标签,有违结构与表现的分离,在后期维护中将是噩梦     建议:不推荐使用,但此方法是以前主要使用的一种清除浮动方法   (2: 父级div定义overflow:hidden     原理:必须定义width或zoom:1,同时不能定义height,使用overflow:hidden时,浏览器会自动检查浮动区域的高度     优点: 简单,代码少,浏览器支持好     缺点: 不能和position配合使用,因为超出的尺寸的会被隐藏     建议:只推荐没有使用position或对overflow:hidden理解比较深的朋友使用   (3: 父级div定义伪类:after和zoom(用于非IE浏览器)     原理:IE8以上和非IE浏览器才支持:after,原理和方法1有点类似,zoom(IE转有属性)可解决ie6,ie7浮动问题     优点: 浏览器支持好