用对象来实现闭包
来源:互联网 发布: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
- 用对象来实现闭包
- 用js来实现栈的对象
- 通过经典题目来理解多种闭包实现方式
- C++中使用重载()来实现闭包
- 用PHP调用Lucene包来实现全文检索(转)
- [转]用PHP调用Lucene包来实现全文检索
- 用PHP调用Lucene包来实现全文检索
- [转]用PHP调用Lucene包来实现全文检索
- [转]用PHP调用Lucene包来实现全文检索
- 用PHP调用Lucene包来实现全文检索
- 用PHP调用Lucene包来实现全文检索
- 用PHP调用Lucene包来实现全文检索
- 用PHP调用Lucene包来实现全文检索
- 用接口来实现页面之间对象的传递
- josephus问题用面向对象的方法来实现
- 用Lock对象来同步线程,实现生产者消费者模式
- 函数闭包的方式实现lua面向对象
- lua绑定cpp对象(闭包与非闭包) 实现
- Spring Boot系列(十) 持久层框架--Mybatis
- string 基本字符序列容器
- unix/linux学习笔记:chapter1
- Android6.0 反编译systemUI
- Netty HTTP 文件下载例子
- 用对象来实现闭包
- lua元方法的简单介绍
- DLL隐式与显式调用浅析
- Spring-Hibernate
- Django 日志模块 logging 的配置
- 利用 word2vec 训练的字向量进行中文分词
- 本周总结20160903
- 关于百度APIStore提供的接口调用失败问题
- SQL学习及回顾第一篇总结