摘要:而函数被当作某个对象的方法调用时也就是非匿名函数,指的是那个对象。但是,匿名函数的作用域是全局的。不过可以把的外部函数的保存在一个变量中,的匿名函数调用这个变量代替。
什么是闭包?
简而言之,闭包就是指有权访问另一个函数作用域中的变量的函数,并且让这些变量的值始终保持在内存中。
常用的创建方法是在一个函数的内部创建另一个函数。like:
function num1(){ var n = 0; add = function(){ n++; } function num2(){ console.log(n); } return num2; } var result = num1(); result(); // 0 add(); result(); // 1
第一次result()的结果是0,第二次是1,因为num2是num1的子函数,它被赋予全局变量,因此会一直占用内存,而num2的内存依赖于num1,因此num1也一直占用内存。不会把第一次得到的n放入垃圾回收机制。
另外add没有用var声明,因此它属于全局变量。
由于闭包会携带包含它的的函数的作用域,因此会比其他函数占据更多的内存,所以为了性能,要慎用闭包。
垃圾回收机制在这里提一下上文说到的垃圾回收机制,原理很简单:找出那些不再继续使用的变量,释放其占用的内存。垃圾回收机制会按照固定的时间间隔,周期性地执行操作。
this对象在全局函数中,this等于window。而函数被当作某个对象的方法调用时(也就是非匿名函数),this指的是那个对象。但是,匿名函数的作用域是全局的。因此匿名函数的this指的是window。
比如下面这个例子:
var name="sara"; var names={ name:"Aom", sayName:function(){ return function(){ return this.name }; } }; alert(names.sayName()()); //"sara"
sayName()返回的是一个匿名函数,匿名函数的作用域是全局的,因此this.name返回的是sara。
不过可以把sayName的外部函数的this保存在一个变量中,sayName的匿名函数调用这个变量代替this。就可以返回到外部函数的name。
实现如下:
var name="sara"; var names={ name:"Aom", sayName:function(){ var self = this; return function(){ return this.name }; } }; alert(names.sayName()()); //"Aom"
this得值在几种特殊情况下也会改变。
var name="sara"; var names={ name:"Aom", sayName:function(){ return this.name } }; names.sayName();//"Aom" (names.sayName)();//"Aom" (names.sayName = names.sayName)();//"sara"
第一种情况很简单,在这里就不做解释;第二种情况,因为(names.sayName)和names.sayName定义是相同的,所以结果是"Aom";第三种情况,括号内进行的赋值是sayName函数本身,并不会附带赋值names的其他内容,因此this发生了改变,取得window,结果为sara。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/81610.html
摘要:深入系列第八篇,介绍理论上的闭包和实践上的闭包,以及从作用域链的角度解析经典的闭包题。定义对闭包的定义为闭包是指那些能够访问自由变量的函数。 JavaScript深入系列第八篇,介绍理论上的闭包和实践上的闭包,以及从作用域链的角度解析经典的闭包题。 定义 MDN 对闭包的定义为: 闭包是指那些能够访问自由变量的函数。 那什么是自由变量呢? 自由变量是指在函数中使用的,但既不是函数参数也...
摘要:而闭包的妙处在于,当函数在执行完毕后它的活动对象不会被销毁,因为匿名函数的作用域链仍然在引用函数的活动对象它的作用域链会被销毁。 一、闭包 闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常用方式是,在一个函数内部创建另一个函数。 请看以下代码:我们在createComparisonFunction函数里创建了一个闭包 function createComparisonFun...
摘要:不过匿名函数的执行环境具有全局性,因此其对象通常指向。在闭包中使用对象可能会导致一些问题。这个对象还包含一个方法它返回一个匿名函数,而匿名函数又返回,这个匿名函数就是闭包。伪代码过程在定义匿名函数之前,把对象赋值给了一个名叫的变量。 this对象 前言:最近在细读Javascript高级程序设计,对于我而言,中文版,书中很多地方翻译的差强人意,所以用自己所理解的,尝试解读下。如有纰漏...
摘要:使用上一篇文章的例子来说明下自由变量进阶期深入浅出图解作用域链和闭包访问外部的今天是今天是其中既不是参数,也不是局部变量,所以是自由变量。 (关注福利,关注本公众号回复[资料]领取优质前端视频,包括Vue、React、Node源码和实战、面试指导) 本周正式开始前端进阶的第二期,本周的主题是作用域闭包,今天是第7天。 本计划一共28期,每期重点攻克一个面试重难点,如果你还不了解本进阶计...
摘要:以上描述,全部符合闭包的描述,那这就是闭包。二执行过程之前的文章讲了函数的执行上下文栈,变量对象,作用域链等内容,接下来通过闭包代码回顾代码是怎么样的执行过程。将活动对象压入作用域链顶端。函数执行结束,弹出执行上下文栈。 本文一共 1300 字,读完只需 5 分钟 概述 闭包, 可以说是每个前端工程师都听说的一个词,咋一看很难从字面上去理解,从而给人留下了闭包是一个重要又难以理解的...
阅读 1842·2023-04-26 02:51
阅读 2888·2021-09-10 10:50
阅读 3101·2021-09-01 10:48
阅读 3660·2019-08-30 15:53
阅读 1834·2019-08-29 18:40
阅读 423·2019-08-29 16:16
阅读 2045·2019-08-29 13:21
阅读 1832·2019-08-29 11:07