闭包

深入理解闭包系列第四篇——常见的一个循环和闭包的错误详解

孤人 提交于 2020-03-06 15:01:29
前面的话   关于常见的一个 循环 和 闭包 的错误,很多资料对此都有文字解释,但还是难以理解。本文将以 执行环境 图示的方式来对此进行更直观的解释,以及对此类需求进行推衍,得到更合适的解决办法 犯错 function foo(){ var arr = []; for(var i = 0; i < 2; i++){ arr[i] = function(){ return i; } } return arr; } var bar = foo(); console.log(bar[0]());//2   以上代码的运行结果是2,而不是预想的0。接下来用执行环境图示的方法,详解到底是哪里出了问题   执行流首先创建并进入全局执行环境,进行 声明提升 过程。执行流执行到第10行,创建并进入foo()函数执行环境,并进行声明提升。然后执行第2行,将arr赋值为[]。然后执行第3行,给arr[0]和arr[1]都赋值为一个匿名函数。然后执行第8行,以arr的值为返回值退出函数。由于此时有闭包的存在,所以foo()执行环境并不会被销毁   执行流进入全局执行环境,继续执行第10行,将函数的返回值arr赋值给bar   执行流执行第11行,访问bar的第0个元素并执行。此时,执行流创建并进入匿名函数执行环境,匿名函数中存在 自由变量 i,需要使用其作用域链匿名函数 -> foo()函数 ->

学习06-闭包和递归

谁说胖子不能爱 提交于 2020-03-06 14:33:01
闭包 闭包的作用 递归 浅拷贝和深拷贝 正则表达式 正则表达式的特点 创建正则表达式 测试正则表达式test 边界符 字符类 量词符 来源: oschina 链接: https://my.oschina.net/u/4454049/blog/3189026

深入理解Javascript闭包概念

你说的曾经没有我的故事 提交于 2020-03-06 12:21:12
一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部能够直接读取全局变量。 Js代码    var n=999;   function f1(){     alert(n);   }   f1(); // 999 还有一方面,在函数外部自然无法读取函数内的局部变量。 Js代码    function f1(){     var n=999;   }   alert(n); // error 这里有一个地方须要注意,函数内部声明变量的时候,一定要使用var命令。假设不用的话,你实际上声明了一个全局变量! Js代码    function f1(){     n=999;   }   f1();   alert(n); // 999 -------------------------------------------------------------------------------------------------------- 二、怎样从外部读取局部变量? 出于种种原因,我们有时候须要得到函数内的局部变量。可是,前面已经说过了,正常情况下,这是办不到的,仅仅有通过变通方法才干实现。 那就是在函数的内部,再定义一个函数。 Js代码   

JavaScript -- 闭包与作用域链

岁酱吖の 提交于 2020-03-06 01:38:34
什么是闭包 红宝书上解释: 闭包 是指有权访问另外一个函数作用域中的变量的函数.闭包就是能够读取其他函数内部变量的函数 MDN 上解释: 闭包是由函数以及创建该函数的词法环境组合而成。这个环境包含了这个闭包创建时所能访问的所有局部变量。 要理解闭包必须先理解什么是作用域以及作用域链。 作用域及作用域链 作用域分为全局作用域和函数作用域,es6 后又引入了块级作用域的概念。 作用域在代码定义的时候就产生了且不会改变,全局变量作用在全局作用域中,而函数内声明的局部变量是在函数作用域中,外部作用域无法访问内部的函数作用域中的变量。 作用域作用: 限制变量的访问权限和访问顺序,隔离变量使不同作用域下的同名变量不会产生冲突。 作用域链: 访问变量时,先查找自身函数作用域内是否有该属性,没有再向外查找父级作用域中是否含有该属性,直到最外层全局作用域,直到即可以访问,没有则报错 ReferenceError,访问变量查找作用域的这个顺序及其层级关系称为作用域链,访问变量时是在作用域链中自下而上(由内到外)查找。 看下面两个作用域的例子: 例子1: var x = 10 function fn ( ) { console . log ( x ) } function show ( f ) { var x = 20 f ( ) //即调用函数 fn(),访问变量 x

闭包_1(概念)

走远了吗. 提交于 2020-03-05 22:44:58
嗯,闭包,我只知道一个函数包一个函数(有个卵用啊!摔) 1.先说作用域。   js没有块级作用域,但js有函数作用域   js有全局变量和局部变量   定义在函数内部的变量在函数外部是访问不到的,这就是局部变量。   提前定义在函数外部的变量是可以在函数内部访问到,这就是全局变量。 2.如果我就想在外边获取到函数内部的变量怎么办呢?   那我就在函数1中再放一个函数2,函数2用来将函数1中定义的值暴露出来。         这就是闭包。    来源: https://www.cnblogs.com/yaooo/p/12422925.html

Python之变量作用域

大兔子大兔子 提交于 2020-03-05 03:14:20
变量作用域   Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。   变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是: L (Local) 局部作用域 E (Enclosing) 闭包函数外的函数中 G (Global) 全局作用域 B (Built-in) 内建作用域 以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。 各作用域关系如图: 内建作用域: a = int(3.14) #int函数在内建作用域中NAME='John' #NAME在全局作用域中 def fun(): name='July' #闭包函数外的函数域 def fun2(): name='Jack' #局部作用域 print(name) fun() #'Jack'   Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这这些语句内定义的变量,外部也可以访问: if True: a=123 print(a) #-------------- 123

js原型,闭包,this,作用域

狂风中的少年 提交于 2020-03-05 00:33:19
闭包:http://www.cnblogs.com/onepixel/p/5036369.html 一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数), 因而这些变量也是该表达式的一部分。闭包的特点:   1. 作为一个函数变量的一个引用,当函数返回时,其处于激活状态。   2. 一个闭包就是当一个函数返回时,一个没有释放资源的栈区。   简单的说,Javascript允许使用内部函数--- 即函数定义和函数表达式位于另一个函数的函数体内。 而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、 参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时, 就会形成闭包。 js解释器在遇到函数定义的时候,会自动把函数和他可能使用的变量 (包括本地变量和父级和祖先级函数的变量(自由变量))一起保存起来. 也就是构建一个闭包,这些变量将不会被内存回收器所回收, 只有当内部的函数不可能被调用以后(例如被删除了,或者没有了指针),才会销毁这个闭包, 而没有任何一个闭包引用的变量才会被下一次内存回收启动时所回收. 当一个内部函数被其外部的函数之外的变量所引用 就形成了一个闭包: function A(){ function B(){ console.log("hello colsure"); } return B; } var c=new A

JS封闭函数、闭包、内置对象

落爺英雄遲暮 提交于 2020-03-05 00:21:55
一、变量作用域 变量作用域指的是变量的作用范围,javascript中的变量分为全局变量和局部变量 1、全局变量: 在函数之外定义的变量,为整个页面公用,函数的内部外部都可以访问。 2、局部变量: 在函数内部定义的变量,只能在定义该变量的函数内部访问,外部无法访问。函数内部访问变量时,先在内部查找是否有此变量,如果有,就使用内部,如果没有,就去外部查找 二、封闭函数 封闭函数是javascript中匿名函数的另外一种写法,创建一个一开始就执行而不用命名的函数。 1、一般函数的定义和执行函数 2、封闭函数的定义和执行:(function(){...})();还可以在函数定义前加上"~"或者"!"符号来定义匿名函数。 三、闭包 闭包就是函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾回收机制收回 1、闭包用途1: 将一个变量长期驻扎在内存当中,可用于循环中存索引值 2、闭包用途2:私有变量计数器,外部无法访问,避免全局变量的污染 四、内置对象 1、document   比如说在商品详情页观看时,想去购买,这是会跳转到登录页面,登录成功后使用该方法跳转到商品详情页   document.referrer//获取上一个跳转页面的地址(需要服务器环境) 2、location   a、window.location.href // 获取或者重定url地址      b

秒懂闭包

你说的曾经没有我的故事 提交于 2020-03-04 18:38:47
闭包是针对嵌套函提出的概念。 闭包=函数+引用环境 闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。 闭包的作用是加强模块化,让相同的逻辑可以加入到各种逻辑环境中。 比如我们要计算一个数组中所有数字的和,这只需要循环遍历数组,把遍历到的数字加起来就行了。如果现在要计算所有元素的积呢?要打印所有的元素呢?解决这些问题都要对数组进行遍历,如果是在不支持闭包的语言中,我们不得不一次又一次重复写循环语句。而在支持闭包的语言中识是不必要的。 来源: CSDN 作者: llwgl 链接: https://blog.csdn.net/llwgl/article/details/104652740

JavaScript之作用域与闭包详解

点点圈 提交于 2020-03-04 16:25:39
前言: JavaScript是一种应用非常广泛的语言,其也有一些自身特点和优势,本文重在讲述其作用域机制以及闭包,会从一些实例来探讨其机理。 作用域在JavaScript程序员日常使用中有不同的含义,如下所示: this绑定的值; this绑定的值定义的执行上下文; 一个变量的“生命周期”; 变量的值解析方案,或词法绑定。 下面将讲诉JavaScript作用域概念,由此引出变量值解析方案的一般想法,最后再探讨JavaScript里闭包这一重要知识点。 1.全局作用域 所有浏览器都支持 window 对象,它表示浏览器窗口,JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。所以,全局变量是 window 对象的属性,全局函数是 window 对象的方法,甚至 HTML DOM 的 document 也是 window 对象的属性之一。 全局变量是JavaScript里生命周期(一个变量多长时间内保持一定的值)最长的变量,其将跨越整个程序,可以被程序中的任何函数方法访问。 在全局下声明的变量都会在window对象下,都在全局作用域中,我们可以通过window对象访问,也可以直接访问。 1 var name = "jeri"; 2 console.log(window.name); // 输出:jeri 3 console.log(name); // 输出