昨天,我弟抛给我一个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内部运行过程的思考。不知对还是不对。有大神经过麻烦指教。

江太公:javascript count(a)(b)(c)(d)运行过程思考的更多相关文章

  1. [JavaScript] js实现简单的代码运行框

    <script type="text/javascript">// <![CDATA[ function runCode(obj) { var winname = ...

  2. javascript的运行过程以及setTimeout的运行机制

    关于javascript的运行机制大家都应该有所了解了吧,其实javascript是一个单线程的机制,但是因为队列的关系它的表现会让我们感觉是一个多线程的错觉.javascript在运行的时候是这样的 ...

  3. javaScript语言的预编译与运行

    JS代码执行的过程: 1.预编译 ---- 事先对js代码做一个预处理 2.代码运行---开始执行JS代码. JS编程: 1.加载DOM的最好在/BODY之前 2.与DOM渲染无关的放在Head里面 ...

  4. 【Hight Performance Javascript】——脚本加载和运行

    脚本加载和运行 当浏览器遇到一个<script>标签时,无法预知javascript是否在<p>标签中添加内容.因此,浏览器停下来,运行javascript代码,然后继续解析. ...

  5. JavaScript 基础:Babel 转译 class 过程窥探

    零.前言 虽然在 JavaScript 中对象无处不在,但这门语言并不使用经典的基于类的继承方式,而是依赖原型,至少在 ES6 之前是这样的.当时,假设我们要定义一个可以设置 id 与坐标的类,我们会 ...

  6. JavaScript new的运行过程

    参考 MDN网站的运算符 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new new 运算符 ...

  7. javascript 解决provisional headers are shown的过程

    请求没有被发送,因为是载入缓存资源. 大概是说 完全相同的请求间隔数毫秒(太短),导致加载失败,查看了chrome控制台发现 Provisional headers are shown 出现在 载入缓 ...

  8. 【转】Eclipse中查看jar包中的源码

    (简单的方式:通过jd-gui来进行反编译,最简单!,参考我的另一篇博文, 地址:http://www.cnblogs.com/gmq-sh/p/4277991.html) Java Decompil ...

  9. Java Decompiler Plugin For Eclipse IDE

    1. 下载JAD , 1.5.8版本的jad在 http://www.softpedia.com/progDownload/JAD-Download-85911.html 将展开后的jad.exe放到 ...

随机推荐

  1. Linux常用命令:sed

    本文记录的是自己在学习<Linux私房菜>中正则表达式的笔记. 关于行尾符$ 如果文件本身没有内容,比如使用touch新建的文件,那么$将会没有意义.例如下面操作: 先使用touch新建了 ...

  2. C#结合Jquery LigerUI Tree插件构造树

    Jquery LigerUI Tree是Jquery LigerUI()的插件之一,使用它可以快速的构建树形菜单.呵呵 废话不说了,直入正题,下面介绍C#结合ligerui 构造树形菜单的两种方法 1 ...

  3. ImageView的ScaleType属性

    ImageView的ScaleType各种值代表的意义: CENTER:不进行任何缩放,将图片放在容器中间 CENTER_CROP:如果图片长宽都大于等于容器长宽,则图片不缩放,否则按固定长宽比缩放, ...

  4. Web基础知识

    这学期学了Web技术这门课,但对这门课是做什么的.有什么用处并不了解,教材是Asp.net实用网站开发,对我这样的初学者大概是深了一点,所以决定对Web技术的背景知识做下整理. 1.Web工作原理 W ...

  5. Oracle创建表空间、用户、授权

    在创建好数据实例(数据库)好后的基础上,后续做的事情如下: ---创建表空间 create tablespace LIS2011DATA logging datafile 'd:\oracle\pro ...

  6. 用EF访问Centos下的MySQL

    环境 : MySQL 5.6.21 64位 CentOS 6.5 64位 VMware 10 Navicat for MySQL 11 VS2013 1.首先搭建centos 的MySQL开发环境 : ...

  7. IIS不能下载ini文件

    1.打开IIS. 2.选择站点或者存放*.ini文件的目录,右键菜单中选择属性. 3.选择“HTTP头”选项卡. 4.点击“MINE类型”. 5.点击“新建”. 6.这是跳出一个对话框,在“扩展名”一 ...

  8. iOS AppIcon尺寸和上传ITunes构建版本尺寸

    避免忘记. 记录一下 App Icon: 29X2940X4058X5876X7687X8780X80120X120152X152167X167180X180 ITunes构建版本: 1242 x 2 ...

  9. linux下 mysql数据库的备份和还原

    1.备份 [root@CentOS ~]# mysqldump -u root -p mysql > ~/mysql.sql #把数据库mysql备份到家目录下命名为mysql.sql Ente ...

  10. 使用scvmm 2012的动态优化管理群集资源

    动态优化(Dynamic Optimization)是在scvmm2012之后引入的一个新特性,简单来说,这个特性的功能就如字面意义一样,在群集范围内使用动态迁移VM的方式优化主机的资源,使主机与VM ...