用对象来实现闭包

来源:互联网 发布:js模拟鼠标拖动事件 编辑:程序博客网 时间:2024/06/06 00:22

在了解了闭包和对象的本质之后,抖个机灵,试着为C++实现闭包。

先看一下js的闭包使用:

function MakeFunc() {    var data = 1;    var myFunc = function(x) {        return data+x;    };    return myFunc;}var f = MakeFunc();f(1);

用C++实现:

class MakeFunc {public:    MakeFunc(): data(1) {}    int operator() (int x){ return data+x;}    ~MakeFunc(){}private:    int data;}MakeFunc f;f(1);

你可能也发现了,要实现闭包,其实就是想个办法,使得内层函数能保存外层函数的自由变量。我这个思路就是在一个c++对象实例里共享了那个变量罢了。

js里大概的实现是:
在函数a定义的时候,为其添加一个作用域链,在作用域链中保存了定义a时的上下文环境,然后在a被执行的时候,为其添加一个活动对象(call object),保留函数参数、a里面的局部变量,活动对象会被放到作用域链的最顶端,这意味着不同层的作用域被连接起来了。这时候发现b在a里面被定义了,所以b也同样会添加一个作用域链,并且将上下文环境加进去,这里其实就是a的作用域链(a的活动对象+a定义时的上下文环境)了。
然后,在a被调用完了之后,把b函数返回给了变量c,这时候因为b被c引用,而b又依赖a,所以a的活动对象是不会被gc回收的。

1 0
原创粉丝点击