Closure

作者: kid551 | 来源:发表于2018-09-28 07:22 被阅读0次

JS当中的一段实现“加法器”的代码。

function makeAdder(a) {
  return function(b) {
    return a + b;
  };
}
var fiveAdder = makeAdder(5);
var tenAdder = makeAdder(10);

fiveAdder(6); // ?
tenAdder(7); // ?

显然,fiveAdder是用来每次加5的加法器,而tenAdder是用来每次加10的加法器。

一个很直接的问题便是,fiveAdder的5和tenAdder的10被存在哪里?


Inner class之于class,就好比是first class function(一等函数)之于函数。只不过这里是first class class(一等类)。你可以直接把一个类的实现返回出来,而不再是返回一个简单的数值。

来自Thinking in Java的一个例子:


interface Incrementable {
    void increment();
}

class Callee1 implements Incrementable {
    private int i = 0;

    public void increment() {
        i++;
        System.out.println(i);
    }
    
}

class MyIncremental {
    public void increment() {
        System.out.println("other operations");
    }
    
    static void f(MyIncremental mi) {
        mi.increment();
    }
}

class Callee2 extends MyIncremental implements Incrementable {
    private int i = 0;
    
    @Override
    public void increment() {
        super.increment();
        i++;
        System.out.println(i);      
    }
    
    // The non-trivial part!
    private class Closure implements Incrementable {

        public void increment() {
            Callee2.this.increment();           
        }       
    }
    
    Incrementable getCallbackRef() {
        return new Closure();
    }
}


// The initiator of calling.
class Caller {
    private Incrementable callbackRef;
    
    Caller(Incrementable cbh) {
        callbackRef = cbh;
    }
    
    void go() {
        // ...... do lots of other things.
        
        // at the end:
        callbackRef.increment();
    }
}

public class Callbacks {
    
    public static void main(String... args) {

        Callee1 c1 = new Callee1();
        Callee2 c2 = new Callee2();
        
        MyIncremental.f(c2);
        
        Caller caller1 = new Caller(c1);
        caller1.go();
        caller1.go();
        Caller caller2 = new Caller(c2);
        caller2.go();
        caller2.go();
    }
}

相关文章

  • scala函数和闭包

    Function and closure

  • Closure。

    梦到他实属平常,但是梦到他流泪却是第一次。他在我对面的椅子上坐下来,明亮有神的双目流出两行泪来,一些无奈一些悲伤,...

  • Closure

    JS当中的一段实现“加法器”的代码。 显然,fiveAdder是用来每次加5的加法器,而tenAdder是用来每次...

  • Closure

    概念 直接来看两个函数的对比 执行 count1()调用第一个函数,很简单。我们会得到 arr1 = [1, 4,...

  • Closure

    写作苦旅,乐在其中 ——写于拜读《On Writing Well》全书后 参加读书会的第一个月,今天终于在大家的陪...

  • Closure

    闭包回调在于从A跳转到B时,将对A赋值的函数对象传给B,在需要赋值的时候,B调用该函数对象即可。 E.G. //...

  • Closure

    我们可用swift的闭包来定义变量的值。 先来一个简单的例子大家先感受感受。 定义一个字符串的变量的方法: 直接赋...

  • Closure

    基本函数 函数签名是不包含参数名 函数式作为一等公民,可以当做变量,返回值,参数,这提升了到函数编程的思想 Clo...

  • closure

    閉包語法表達: 從上下文推斷當將閉包作為內聯閉包表達式傳遞給函數或方法時,總是可以推斷出參數類型和返回類型。因此,...

  • Closure

    1. 概念 闭包是指拥有多个变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分...

网友评论

      本文标题:Closure

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