add是对象,ret是他的方法,该方法返回一个add对象

解决方案 »

  1.   

    估计你的最后一句 alert(add(5)(100)(100)(1)); 有误
      

  2.   

    这个代码还是有些意思的,我未必能解释清楚也未必对,你仅当参考吧。
    我不知道你有没有数据结构方面的知识,如果有的话就好理解了。
    在javascript中其实所有的对象都是以类似hash表的形式来存在的,因此它允许我们可以对对象添加和删除
    属性(当然添加的属性也是一个对象,因此也是一个hash,所以你可以无限迭代),比如
    var obj={};
    obj.name="your name";
    obj.age=23;
    alert(obj.name);
    delete obj.name;
    alert(obj.name);Function 是javascript内置的对象自身具有属性和特性,比如可以执行并且返回执行结果等等,可是他也同样
    符合javascript中对象的一些共性:可以对对象添加和删除属性(注:一些内部属性无法删除和添加,比如你
    无法删除和添加执行特性),我们用一个例子可以证明:function myFunc(){
        return "我被执行了";
    }myFunc.show=function(){
        alert("123");
    }myFunc.funName="我的名字:myFunc"myFunc.show();
    alert(myFunc());
    alert(myFunc.funName);
    delete myFunc.funName
    alert(myFunc.funName);好了有了上面的交代以后也就比较容易理解这段程序了,他的返回结果是一个函数,并且是一个
    添加了两个方法valueOf、toString的函数,这也就是为什么你可以这样写了add(5)(100),因为
    add(5)的执行结果返回的就是一个函数.这里边还有一些细节需要解释,请看下一帖吧,要不出点故障就白写了
    先保存下
      

  3.   

    怎么没反应了呀,xingqiliudehuanghun  走了吗?我一直在按F5
      

  4.   

    接上一帖
    上面我们提到了javascript中对象的类似hash表的性质,以及对程序的一点分析,返回结果是一函数。
    仔细看下返回的这个函数会发现有些特别
    function add(a,b){
       b=b||0;
       var s=a+b;
       var ret =function(aa){
            return add(aa,s)//注意这个S
       } 
       ......
    这个S是返回的函数的函数体中所没有定义的是在返回函数体之外存在的。在c语言和java这些语言中
    这种用法绝对是不允许的,因为函数一旦执行后其内部的变量就会被回收掉,这是其他地方再引用这些
    变量肯定会出错的。但是javascript与java不一样它是动态语言,它对变量的管理符合函数式语言的特性
    :1.函数是数据,2.函数可以存储数据,3.并且函数执行完之后内部变量保持函数执行最终状态不重置,
    而函数存储数据的场所叫做必包(可能不是很准确,你可以查一下有关必包的知识),4.必包只有在没
    有其他人引用的时候才会被回收。
       好了交代了一些技术点之后我们来分析下alert(add(5)(100)(100)(1))这个程序是如何运行的
    1.add(5) 返回一个添加了自定义函数的函数,建立一个必包因为返回的函数需要使用局部变量S2.add(5)(100) 执行add(5)步返回的函数,以输入的100和add(5)函数必包中的变量s最为实参执行函数
        add,再返回一添加了自定义函数的函数,并且再建立以必包保存s,因为返回的函数还要用
    ......
    好了这就是这个函数的整个执行过程,不知道谁设计的程序包括了这么多javascript语言的特性,很适合做
    教学的例子,虽然比较难懂一些,而且效率也很低