实现语法的功能:var a = add(1)(2)(3); //6没看懂别人的代码

码农世界
  • 730

实现语法的功能:var a = add(1)(2)(3); //6

function add(a) { 
      var temp = function(b) {return add(a + b);} 
      temp.valueOf = temp.toString = function(){return a;}; 
      return temp;
    } 
    var ans = add(1)(2)(3); 
    alert(ans); // 6

这段代码是别人写的,小弟才疏学浅没看明白,很多地方不知,请大神们帮分析一下,
关于add(a+b)递归糊涂,还有为什么要将temp的valueOf方法改变,这样有什么用等等问题

评论
阅读 4.3k
4 个回答
✓ 已被采纳

简单的add(a)返回的事实一个函数add1, 然后add1(a)再继续返回,一直执行到结束。当然在执行过程中你得判断返回的值是一个函数还是一个返回的值。于是就有了使用valueOf来判断返回对象有没有valueOf方法,如果有那么就获得他的原始值,返回他的原始值。或者toString返回字符串。

简单讲,在对对象(广义的,包括函数对象)进行+ - * / == > < >= <=运算时,会依次尝试调用私有toString 私有valueOf 原型toString 原型valueOf,直到遇到返回基本类型(如数字或字符串)停止。

String.valueOf() 方法的使用

  1. 由 基本数据型态转换成 String
    String 类别中已经提供了将基本数据型态转换成 String 的 static 方法

也就是 String.valueOf() 这个参数多载的方法
有下列几种
String.valueOf(boolean b) : 将 boolean 变量 b 转换成字符串
String.valueOf(char c) : 将 char 变量 c 转换成字符串
String.valueOf(char[] data) : 将 char 数组 data 转换成字符串
String.valueOf(char[] data, int offset, int count) :
将 char 数组 data 中 由 data[offset] 开始取 count 个元素 转换成字符串
String.valueOf(double d) : 将 double 变量 d 转换成字符串
String.valueOf(float f) : 将 float 变量 f 转换成字符串
String.valueOf(int i) : 将 int 变量 i 转换成字符串
String.valueOf(long l) : 将 long 变量 l 转换成字符串
String.valueOf(Object obj) : 将 obj 对象转换成 字符串, 等于 obj.toString()
用法如:
int i = 10;
String str = String.valueOf(i);
这时候 str 就会是 "10"

关于里面递归问题 你传了几个参数就调用几次

刚看到 问题的时候 其实我也是 有点懵逼的赶脚。
后来冷静了下,复制执行了下。才慢慢缓过神来。
这种写法我以前是完全没遇到过的,不知道算不算我孤陋寡闻,还是这个算冷门写法。
这个 其实要拆成两个常识(知识点)来看
[1]:a(1)(2)(3);
[2]:alert(ans);

题主 对于 [1] 应该没问题了,但是我还是来说说我的理解。
这种连着括号的玩法,咋一看 :“咦,不会报错。噢,原来 返回值是个方法”。
再看 temp 里有执行 add,这样就形成了递归了。这样的话 括号应该可以无限连下去了。

至于:[2] 么。
其实 主要是 alter();

个人感觉 alter有点类似java里的 System.out.println,都会调用括号里的对象的 toString 方法
比如: System.out.println("abc"); 里面会执行 "acb".toString();
可能 alert 也应该是整个样子的,所以
当 temp.valueOf = temp.toString = function的时候,也就是设定了。但alert这种输出的时候会 触发 temp这个方法的toString 或者valueOf 方法,而 这两个方法被重置了。也就变成了return a;
而a这个变量,则 是不停的在递归中 加上去了。最终呈现的时候就是 a=1+2+3 了.
撰写回答

登录后参与交流、获取后续更新提醒

宣传栏