关于闭包

对闭包的认识:

百度过好几次“JS闭包”,最粗浅、最常见的只要是这种语法模式的,就算是传说中的“闭包”

function(){

  return function(){

  }

}

虽然能读懂也能计算出正确的结果,但是对其中的原理今天才有一点浅薄 的认知,说说自己的理解:

背景:JavaScript是没有块级作用域的,所以可能造成全局变量的污染,闭包明确了JavaScript的作用域

实现原理:

在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。

Peter J. Landin 在1964年将术语闭包定义为一种包含环境成分和控制成分的实体

上面是维基百科对闭包的解释,我觉得“闭包是由函数和其相关的引用环境组合而成的实体”是一个高度凝练并准确的定义。

闭包能够访问外部变量(包括对象引用)并在自己的运行环境里面保存这些变量,即使包含外部变量的函数已经退出,内部函数在没有退出的情况下依然能维持外部函数的局部变量。

例如:

function foo(x) {
    var tmp = 3;
    return function (y) {
        alert(x + y + (++tmp));
    }
}
var bar = foo(2); // bar 现在是一个闭包
bar(10);
运行结果显示:每运行一次,++temp会在原来的基础上累计+1;
 
当然闭包的形式比一定包含return function 的桥段~~
 
PS:有位大神总结:
闭包是从用户角度考虑的一种设计概念,它基于对上下文的分析,把龌龊的事情、复杂的事情和外部环境交互的事情都自己做了,留给用户一个很自然的接口。

闭包是js的一种语法糖,这也是闭包在写组件的时候重要思想,正在积极的理解中,等再度深刻理解之后,再补充。

 

posted @ 2017-06-27 16:59  青青向月葵  阅读(189)  评论(0)    收藏  举报