昨天,我弟抛给我一个js的题,使用类似标题那样的调用方法计算a*b*c*d以致无穷的实现方法。思考了半天,终于理清了它的运行过程,记录于下:

函数体:

 <!DOCTYPE html>
<html>
<head>
<title>a</title>
</head>
<body>
<p id="a"></p>
<script type="text/javascript">
function count(x){
var fn = function(y){
return count(x*y);
}
fn.toString = function(){
return x;
};
return fn;
}
alert(count(77)(33)(55));
</script>
</body>
</html>

这个函数的另外一个实现方法:

<!DOCTYPE html>
<html>
<head>
<title>a</title>
</head>
<body>
<p id="a"></p>
<script type="text/javascript">
function count(x){
count.toString = function(){
return this.p;
};
count.p = (count.p || )* x;
return count;
}
alert(count()()());
</script>
</body>
</html>

第一种:

如果计算一个单值,count(77),fn被赋值一个函数function(){return count(x*y)},这个函数的目的是传另外参数并返回函数本体进行递归,当然此时只是赋值不会调用,接着将fn的内置构造函数重新定义为function(){return x;},其目的是当fn被调用的时候,自动调用toString方法,返回传过来的x值,最后返回被赋值函数的fn变量。此时fn的toString方法被调起,返回77。结束。

而若计算count(77)(33),第一次运行过程跟上面类似,当fn被调起的时候实际类同于fn(33),也即33作为y参传入被赋值函数的fn变量函数,由于未退出count函数体,x参未被覆盖,还被驻留在内存中,因此在count(x*y)中被计算,成了count(77*33)也即count(2541),这个计算过程发生在fn被调用的时候,然后递归调用count,此时x变为2541,fn的toString的x将返回这个值。也即在结束跳出函数体的时候fn调用了toString最终返回2541。

再计算count(77)(33)(55),前面运算过程同上,此时被传入的x是2541,fn被赋值函数体,fn的toString方法被重写,然后fn返回,如果被调起,则进入fn的函数体执行,此时的x2541还在内存中,y55被传入,count再次递归,x变成了2541*55,即139755,被作为toString自动调起的时候的返回值返回。

第二种:

给函数定义一个变量p,p的初始值被赋予了1,目的是在做第一次乘法运算的时候不改变x值,将其与传进来的x参数进行乘积后的结果返回给toString这个自调起的方法,当count在最后返回的时候,自动调用toString,计算count(33)(55)(77),它就是一步步从里到外计算的过程,每次都改变传入的this.p值,最终返回他。

以上即是对这个问题实现后js内部运行过程的思考。不知对还是不对。有大神经过麻烦指教。

最新文章

  1. Windows Server 2008 R2 下配置证书服务器和HTTPS方式访问网站
  2. 开发维护大型 Java 项目的建议
  3. linux sed和awk的区别
  4. 实现多项式的JAVA类
  5. HDU 1312 http://acm.hdu.edu.cn/showproblem.php?pid=1312
  6. 角色控制器 Character Controller
  7. Combinations ——LeetCode
  8. document.body的一些用法以及js中的常见问题
  9. Android FM学习中的模块 FM启动过程
  10. ajax 页面请求后,jsp页面定位
  11. AngularJs 第三节随笔
  12. AngularJS之备忘与诀窍
  13. 《HTTP权威指南》4-连接管理
  14. 【Android】ScaleAnimation 详解
  15. Android动画-View动画
  16. 自动登录(过滤器filter的应用)
  17. (转)linux中nmcli命令的使用及网络配置
  18. 1、iptables-netfilter基础
  19. kbmmw 中JSON 中使用SQL 查询
  20. java.lang.NoClassDefFoundError Could not initialize class 异常的处理

热门文章

  1. Fragment配合RadioGroup实现点击切换布局
  2. 学习 AppFuse
  3. [Unity游戏开发]向量在游戏开发中的应用(二)
  4. SQL*Plus中替换变量与定义变量
  5. SQL Server修改数据库对象所有者(Owner)浅析
  6. ORACLE 字符串超长问题解决方案
  7. Android 通过Uri获取Bitmap对象
  8. 腾讯 Bugly for Xamarin Android 的插件
  9. Kibana+Logstash+Elasticsearch 日志查询系统
  10. js/jquery/html前端开发常用到代码片段