首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >闭包示例的流程流程

闭包示例的流程流程
EN

Stack Overflow用户
提问于 2019-03-03 02:17:56
回答 1查看 88关注 0票数 1

第一次经历了一个闭包例子,但是我很难把我的头绕在控制流上。

代码语言:javascript
复制
public class TestLambdaClosure {

    public static void main(String[] args) {

        int a= 10;
        int b=20;
        //doProcess(a, i-> System.out.println(i+b));
        doProcess(a, new Process() {

            @Override
            public void process(int i) {
                System.out.println(i+b);
            }
        });
    }
    public static void doProcess(int i, Process p) {
        p.process(i);
    }

    interface Process{
        void process(int i);
    }
}

当调用p.process(i)时,b是如何进入作用域的?此外,控制流在这里内部是如何工作的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-03 06:30:39

闭包允许您通过将(代码和上下文)封装到单个构造中来建模行为。

关键的概念是,您的函数代码(lambda)不仅可以引用它自己的变量,还可以引用代码之外的所有可见变量,在您的情况下,变量ab

在Java中,闭包只能引用最终或有效的最终变量。这意味着,变量的引用不能更改,闭包只看到实际的不可变状态(值实际上不是不可变的,最终意味着变量不能重新分配)。在理论上,这是不必要的。例如,在JavaScript中,可以编写这样的代码:

代码语言:javascript
复制
function newCounter() { 
    let count = 0; 
    return function() { return ++count; }; 
} 
const nc = newCounter(); 
console.log(nc()); // 1 
console.log(nc()); // 2 
console.log(nc()); // 3

在这里,newCounter的高级内部函数仍然可以访问更高级的count(其上下文),并且可以修改它(变量是可变的)。

注意,在闭包之外,代码的任何其他部分都无法访问变量counter

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54964992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档