刚学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#所以对这方法很不理解
<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#所以对这方法很不理解
解决方案 »
- 怎么定时调用啊 谢谢
- 用JQUERY getJSON 跨域拿 HTML代码 怎么拿啊,我这个例子没成功
- 想实现全屏类似于FullScreen效果,但不是打开新窗口而是在原来的窗口实现(急 马上送分)
- open打开问题
- 正则表达式
- 如何在类内部用setInterval调用类内过程
- 关于日期转换问题!!!
- 关于在HTML编辑器中使用<A、<img、<OBJECT等标签出现的会自动更改问题:<a href="a.html">会转换为<a href="http://www/a.html">……
- cookies的问题:为什么不在同一目录下的文件不能得到COOKIES值?
- 我想做一个类似加载的效果,有没有大神知道为啥我这个for循环每一次执行的时候不做暂停啊
- js如何获取多个服务器控件并判断
- JS遍历IMG
我觉得你的问题主要在于三个方面:
一是变量的作用域。简单地说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]...