刚学JS。很多语法看不懂。。求高手指点下面代码
<script>
<!--
function dwn(s)
{
document.write(s + "<br/>");
}
//累加器:闭包作为返回值
function add(a, b)
{
b = b || 0;
var s = a + b;

//返回一个供进一步累加的闭包
var ret = function(a){
return add(a, s);    //这里不就成无限迭代了麽
}
ret.valueOf = ret.toString = function(){
return s;
}
return ret;
}
dwn(add(5)); //5
dwn(add(5)(10)); //15     add(5)(10)..这样能把10传进add里面?
dwn(add(5)(10)(20)); //35
-->
</script>输出:
5
15
35问题看红色字体。。我只学过C#所以对这方法很不理解

解决方案 »

  1.   

    C#属于传统的面向对象语言,JS属于脚本语言一类的,语法和思想都很不一样。找本书看看吧。
    我觉得你的问题主要在于三个方面:
    一是变量的作用域。简单地说JS里只要上下文里可见的变量都是可以被引用的,所以ret里面引用了上文的s,也就是说当ret被执行的时候它会取到自己那个作用域里的s。
    二个是对函数的引用。ret被定义成一个函数,但是并没有直接调用它,所以是不会无限迭代的。在add函数的末尾ret被作为返回值返回回去,这有点像C#里的委托。因为返回值是一个函数,所以如果你用
    var result = add(5);
    这时候的返回值其实是个函数,也就是说result可以被作为函数使用,即可以用
    result(10);
    简化一下,不就是add(5)(10);了
    三是函数参数。JS里给函数定义了多少参数并不一定都要用到,没有定义的参数也并不代表没有参数。这是脚本语言比较自由的地方。举例说,
    function(a, b) {...}
    当你调用的时候如果只传递了一个参数,那会赋值给a;传了两个参数的话,b就有值了(否则是undefined);无论传了多少参数,都可以用arguments数组来引用[0],[1],[2]...
      

  2.   

    主要注意return,valueOf,toString的用法!