闭包

作者: 小红依 | 来源:发表于2018-08-05 16:03 被阅读5次

作用域和作用域链

当某个函数被调用时,会创建一个执行环境及相应的作用域链。然后,使用argument和其他命名参数的值来初始化函数的活动对象。但在作用域链中,外部函数的活动对象始终处于第二位,外部函数的外部函数的活动对象处于第三位,...直至作为作用域链终点的全局执行环境。

闭包

当在函数内部定义了函数时,就创建了闭包。

闭包的作用域链包含着它自己的作用域,函数的作用域和全局的作用域。

在函数内定义的闭包,因为保存着函数的作用域,在使用后不会被回收,因此造成了内存泄露。

规避内存泄露的方法是使用后将闭包引用到的函数内的变量至为空。注意:不能只将它引用到的变量至为空,因为它引用的是整个函数的活动对象。

说到活动对象,下面看一个关于闭包经常会靠的问题

<ul>
    <li>编号1,点击我请弹出1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
</ul>


var list = document.getElementsByTagName('li');
for (var i = 0; i < list.length; i++) {
    list[i].addEventListener('click', function(){
        alert(i + 1)
    }, true)
}...


这个的结果是每个输出的都是6。因为每个函数内,都保存着全局的活动对象,所以它们引用的都是同一个变量i。

我们可以通过创建另一个匿名函数强制让闭包的行为符合预期

var list = document.getElementsByTagName('li');
for (var i = 0; i < list.length; i++) {
    list[i].addEventListener('click', function(i){
        return function(){
            alert(i + 1)
        }
    }(i), true)
}...

闭包中this的问题

因为闭包经常设计到创建匿名函数,所以需要非常注意你创建的闭包的this指向的问题。关于this指向只有一个原则,只要它是个匿名函数,那它一个this指向window。致于怎样判断它是不是一个匿名函数,就需要多加练习了。

另外要提到的一点是,在《javascript高级程序设计》中,提到了可以用

var _this = this

的办法来保存this的指向。这是一个很好的方法,但是在有了es6的箭头函数后,关于this指向带来的问题几乎都可以用它来规避了。

用闭包创建块级作用域

在es5中是没有块级作用域的概念的,只有函数作用域。创建环境作用域的目的是避免多人协同工作是变量名相互重复。

(function(){})()

这样就创建了一个块级作用域。为什么要用括号括起来?因为解析器会把以function开头的解析为函数声明。

在es6中,我们可以使用let来创建块级作用域。

相关文章

  • swift-闭包

    闭包 闭包定义 闭包简化 - 尾随闭包 闭包参数 闭包返回值 闭包的循环引用

  • 闭包,闭包,闭包

    1、这家伙到底是什么? 网上关于这个的讨论的太多了太多了,有各种的举例子,但是大部分还在寻找这个答案的小伙伴对于变...

  • 闭包-Closures [swift 5.1]

    闭包的语法 尾随闭包 闭包逃离 自动闭包

  • Day7 闭包(Closures)

    本页包含内容:• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包 1、闭包表达式 闭包...

  • Python闭包

    闭包 = 环境变量 + 函数 调用闭包内部的环境变量 闭包的经典误区 闭包与非闭包实现人类走路 非闭包 闭包

  • 闭包(closure)

    ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...

  • swift- 闭包一

    /*• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包*/

  • (9) python之闭包

    闭包闭包 = 函数 + 环境变量(函数定义的时候) 一个最简单的闭包 闭包不受外部变量影响 非闭包 闭包 闭包 只...

  • Swift-进阶 :闭包(二)逃逸闭包 & 非逃逸闭包

    本文主要分析逃逸闭包 、非逃逸闭包、自动闭包 逃逸闭包 & 非逃逸闭包 逃逸闭包定义 当闭包作为一个实际参数传递给...

  • javascript闭包详解

    跟我念 bi 闭 bao包 ,闭包的闭,闭包的包。。 闭包的简介 在计算机科学中,闭包(英语:Closure),又...

网友评论

    本文标题:闭包

    本文链接:https://www.haomeiwen.com/subject/xvmbvftx.html