JS--闭包(二)

这里我们根据之前介绍的闭包延伸一下其他的知识点。

在闭包中,其保存的是整个变量对象。闭包只能取得包含函数中任何变量的最后一个值。下面举个栗子:


以上整个函数createFn()执行后会返回一个result数组,表面上看result数组中的每个函数执行后会返回自己的索引值,例如0位置的函数返回0,1位置的函数返回1....,,实际上返回的都是10,。这是因为每创建的内部函数会将外部函数即createFn的活动对象添加到其作用域链上,所以它们引用的都是同一个变量i。所以当createFn函数返回后,i的值已经变为10了,所以内部函数所引用外部函数i的值也就是10了。如果要输出的是每个函数在数组中的下标,我们可以创建另一个匿名函数。如下:


关于this对象:this对象是在运行时基于函数的执行环境绑定的,在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。然而,匿名函数的执行环境是具有局限性,其this对象通常是指向window的

由于闭包的编写,这一点可能有些不同:


当执行obj对象中getName方法返回出来的函数,猜猜会返回什么字符串。并不是"MY NAME",返回的是"WINDOW"。


这是因为,每个函数调用的时候都会去得到两个特殊的变量,this和arguments。内部函数在搜索这两个变量时,只会搜索到其活动对象位置。因为不会访问其外部函数这个两个变量。如果把外部函数的this存到闭包能够访问到的变量里面,那么就可以让闭包访问该对象了。


this和arguments有同样的问题,那么就用同样的方法进行处理就好了。

内存泄漏:闭包在IE的这些版本中会导致一些特殊的问题。如果闭包的作用域链中保存一个HTML元素。那么就意味着这个元素无法被销毁。


以上函数创建了一个作为ele元素事件处理程序的闭包。这个闭包又引用了外部函数的一个变量ele,这就导致无法减少对ele的引用,只要匿名函数存在,那么就用于不会收回。

必须记住:闭包会引用包含函数的整个活动对象!!而并不是其中的某个变量或者dom元素。


--------以上根据javascript高级程序设计总结。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 一、变量...
    zock阅读 4,695评论 2 6
  • 闭包: 官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该...
    小裁缝sun阅读 3,795评论 0 5
  • “哗哗哗……”你可曾知道这清脆的声音是我发出来的? “噗通噗通…”你可曾知道这声音是群鱼儿摇曳的声音? “哈哈哈…...
    叶流凡阅读 1,675评论 0 0
  • 最喜欢傍晚 天还微亮 校园里草地上 传来吉他,手鼓,还有喑哑磁性的歌声 校园里就是该多一些音乐声 除了校园广播之外...
    可爱蛋黄派阅读 1,549评论 0 0
  • -01- 有没有发现,当你爱上一个人的时候,觉得他说的每句废话都有趣,在拥挤的人潮中猛然想起,会忍不住偷笑,回味无...
    梦与七鹿阅读 1,535评论 0 0

友情链接更多精彩内容