闭包

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

定义

  • 最通俗直接的定义,如果一个函数访问了它的外部变量(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;
    end

local inner = func();     --调用func()函数,返回内部函数给inner,打印:F
inner();          --调用内部函数,打印:1
inner();          --调用内部函数,打印:2
inner();          --调用内部函数,打印:3

local other = func();     --与inner不同的是,获取另一个内部函数实例,打印:F
other();          --调用另一个内部函数实例,打印:1
other();          --同上,打印:2

日常用途

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

PS

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

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




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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haobaworenle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值