关于作用域的问题-----javascript与c++

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());

 

 如何用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 " );
}

 

从这里看到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作用域 其实不能算是作用域 只是顺次执行的语句

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值