闭包

来源:互联网 发布:致胜轮毂数据 编辑:程序博客网 时间:2024/05/17 20:31

(个人理解,欢迎各位指正)

定义

  • 最通俗直接的定义,如果一个函数访问了它的外部变量(upvalue),那么这个函数就成了一个闭包。
  • 放宽部分严谨性的更容易理解的定义,如果外部函数中嵌套的内部函数,内部函数调用外部函数的变量,并且该内部函数作为外部函数的return值,那么return的这个内部函数就是一个闭包。(当然,外部函数不是闭包的必需品)

关键词

upvalue:
(用内外函数介绍)如果内部函数中调用外部函数的某个变量,这个变量对内部函数来说不是全局变量也不是局部变量,我们称之为“外部的局部变量”(external local variable)或者upvalue。

函数:
技术上来讲,闭包指“值”而不是指函数,函数仅仅是闭包的一个原型声明;尽管如此,在不会导致混淆的情况下我们继续使用术语函数代指闭包。

外部函数:
外部函数不是必需的!通过访问外部变量,一个闭包可以“维持”这些变量的存在。对应到有外部函数的情况的表现,如果任何一个或多个内部函数在外部函数退出后却没有退出,那么内部函数就维持了外部函数的这些局部数据。

举例子

1、这个调用了tmp,但不算闭包

function foo(x) {    var tmp = 3;    function bar(y) {        alert(x + y + (++tmp));    }    bar(10);}foo(2)

2、return这个内部函数时,就成了一个闭包

function foo(x) {    var tmp = 3;    return function (y) {        alert(x + y + (++tmp));    }}var bar = foo(2);     // bar现在是一个闭包bar(10);

3、面向对象思维编程

function func()    local index = 1;    print("F");    return function()        print(index);        index = index + 1;    endlocal inner = func();     --调用func()函数,返回内部函数给inner,打印:Finner();          --调用内部函数,打印:1inner();          --调用内部函数,打印:2inner();          --调用内部函数,打印:3local other = func();     --与inner不同的是,获取另一个内部函数实例,打印:Fother();          --调用另一个内部函数实例,打印:1other();          --同上,打印:2

日常用途

  • 常用来做定时器、计时器、循环函数等。
  • 闭包经常用于创建含有隐藏数据的函数(但并不总是这样)。
  • 闭包功能是一个很好的保存局部变量的方式,这一点对程序员的影响很大。

PS

  • 经常是设计为显式函数名,把函数赋值成变量,再传递给函数作为参数进行使用。

    function a(func)    print(func(2))endfunction b(arg)    return arg * argenda(b)  --把b函数传递给a作为参数




参考文章:
闭包_搜狗百科
Javascript闭包——懂不懂由你,反正我是懂了
lua语言中闭包的学习心得

0 0
原创粉丝点击