javascript一直被很深地误解着,很多高手这样告诉我。
我对javascript的理解过程是这样的:
- java?
- 只是一种脚本
- 跟c类似的东西
- 面向对象?基于对象!
- 面向对象!类继承支持
- 原型继承支持
- 披着c外衣的Lisp:函数式编程支持
- 动态语言:元类继承支持
越深入了解 我越感觉到js的强大 很多方面 我感觉它甚至远远超过了c++
然而 我很快发现 我之所以会这样认为是因为我不够了解c++
我一直认为js的函数嵌套很神奇 这是c++不支持的,于是我想到一个问题:
如何把下面一段js代码翻译成c++
function
a(flag)
{
var x = 0 ;
function up()
{
return x ++ ;
}
function down()
{
return x -- ;
}
if (flag) return up;
else return down;
}
var m = a( true );
alert(m());
alert(m());
{
var x = 0 ;
function up()
{
return x ++ ;
}
function down()
{
return x -- ;
}
if (flag) return up;
else return down;
}
var m = a( true );
alert(m());
alert(m());
如何用c++表达这样的逻辑呢? 把函数作为返回值 并且含有嵌套的函数定义 这对c++来说似乎是个难题。
#include
<
iostream
>
using namespace std;
class jsfunction
{
public :
virtual int run() = 0 ;
};
class jsfunction_a
{
int x;
class jsfunction_up: public jsfunction
{
private :
jsfunction_a * domain;
public :
jsfunction_up(jsfunction_a * d):domain(d)
{
}
int run()
{
cout << (domain -> x) << endl;
return (domain -> x) ++ ;
}
};
class jsfunction_down: public jsfunction
{
private :
jsfunction_a * domain;
public :
jsfunction_down(jsfunction_a * d):domain(d)
{
}
int run()
{
cout << (domain -> x) << endl;
return (domain -> x) -- ;
}
};
public :
jsfunction * run( bool flag)
{
jsfunction_up * up = new jsfunction_up((jsfunction_a * ) this );
jsfunction_down * down = new jsfunction_down((jsfunction_a * ) this );
// cout<<(this->x)<<endl;
if (flag) return up;
else return down;
}
jsfunction_a():x( 0 )
{
}
};
int main()
{
jsfunction_a a1;
jsfunction * m1 = a1.run( true );
m1 -> run();
m1 -> run();
m1 -> run();
m1 -> run();
jsfunction_a a2;
jsfunction * m2 = a2.run( false );
m2 -> run();
m2 -> run();
m2 -> run();
m2 -> run();
delete m1;
delete m2;
system( " pause " );
}
using namespace std;
class jsfunction
{
public :
virtual int run() = 0 ;
};
class jsfunction_a
{
int x;
class jsfunction_up: public jsfunction
{
private :
jsfunction_a * domain;
public :
jsfunction_up(jsfunction_a * d):domain(d)
{
}
int run()
{
cout << (domain -> x) << endl;
return (domain -> x) ++ ;
}
};
class jsfunction_down: public jsfunction
{
private :
jsfunction_a * domain;
public :
jsfunction_down(jsfunction_a * d):domain(d)
{
}
int run()
{
cout << (domain -> x) << endl;
return (domain -> x) -- ;
}
};
public :
jsfunction * run( bool flag)
{
jsfunction_up * up = new jsfunction_up((jsfunction_a * ) this );
jsfunction_down * down = new jsfunction_down((jsfunction_a * ) this );
// cout<<(this->x)<<endl;
if (flag) return up;
else return down;
}
jsfunction_a():x( 0 )
{
}
};
int main()
{
jsfunction_a a1;
jsfunction * m1 = a1.run( true );
m1 -> run();
m1 -> run();
m1 -> run();
m1 -> run();
jsfunction_a a2;
jsfunction * m2 = a2.run( false );
m2 -> run();
m2 -> run();
m2 -> run();
m2 -> run();
delete m1;
delete m2;
system( " pause " );
}
从这里看到js的函数之所以允许嵌套 是因为js的函数作用域其实性质是和c++的类作用域相似的。在java中 传递函数参数使用一个算子对象把函数包裹起来 实际上js的函数对象包括了对象声明和创建的过程 它的()运算执行了它的run方法(当然也可能叫别的名字)
我这里的c++代码对js函数的实现不完整 只是大概的思路 真正的实现还要处理返回值类型 考虑js的this传入 考虑参数表 不过我不打算写js引擎 就算了:P
回到作用域问题 c++里有几种作用域?
- namespace
- class
- function
- 块作用域
namespace作用域 声明作用域 所有成员都对外开放 (无名的namespace所有成员都不对外开放) 一般把它看作是管理命名的一种方法 编译时全部检查
class作用域 作用域的模板 每次被实例化都产生一个独立的作用域 作为c++最重要的规则之一 class的性质比较多 protect public private 继承 友元这些性质 在C++的书里讲得很多了
function作用域 其实不能算是作用域 只是顺次执行的语句