今天群里有人问一个js问题,现列出以便其他人参考。

Function.prototype.curry=function(){
var slice=Array.prototype.slice,
args=slice.apply(arguments),
that=this;
return function(){
console.log(args.concat(slice.apply(arguments)))
return that.apply(null, args.concat(slice.apply(arguments)) );
}
}
function add(a,b){
return a+b;
}
var q=add.curry(10);
q(2)
这里我将代码改变了一下,便于解析:(其实就是:函数与传递给它的参数组合产生新函数。)
改变:
Function.prototype.curry=function(){
var slice=Array.prototype.slice,
args=slice.apply(arguments),// 参数变为数组,以便使用concat
that=this;
return function(){
var param = slice.apply(arguments).concat(args);
console.log(param)
return that.apply(null, param );
}
}
function add(a,b){
return a+b;
}
var q=add.curry(10);
q(2)

分析:

首先add.curry(10);,curry最终返回了一个function,并且这个function是闭包(因为内部使用的变量名是上面的add的变量,即引用了但不释放变量):
var slice=Array.prototype.slice;//将要使用slice方法,这里简写引用
args=slice.apply(arguments),// add函数的参数变为数组,以便使用数组的concat方法
that=this;//存放add的引用。。
执行q(2)则内部执行过程:
var param = slice.apply(arguments).concat(args);显然这里slice和args都是add函数的引用(闭包用上了),而arguments则是q的参数。含义:q的参数调用数组的slice方法,然后与前面保存add的args数组进行连接。
return that.apply(null, param ); 现在新数组[2,10]作为参数调用add的方法(that的引用),返回结果。

js问题解释的更多相关文章

  1. 关于js函数解释(包括内嵌,对象等)

    常用写法: function add(a,b) { return a + b; } alert(add(1,2)); // 结果 3 当我们这么定义函数的时候,函数内容会被编译(但不会立即执行,除非我 ...

  2. JS 预解释相关理解

    1.JS中的内存空间分为两种:栈内存.堆内存 栈内存:提供JS代码执行的环境;存储基本数据类型的值; ->全局作用域或者私有的作用域其实都是栈内存 堆内存:存储引用数据类型的值(对象是把属性名和 ...

  3. JS是解释型还是编译型语言?

    解释型和编译型语言 解释型语言 解释型语言是对代码进行一句一句的直接运行,在程序运行期间,使用解释器动态将代码解释为机器码,再运行. 编译型语言 编译型语言是需要使用编译器先对代码进行编译为机器码,再 ...

  4. JS预解释

    1.声明(declare)  var num   // 告诉浏览器在全局作用域中有一个num变量 定义(defined) num = 12 // 给我们的比变量进行赋值 2.var:在预解释时只是提前 ...

  5. JS预解释的总结

    预解释阶段发生在创建了堆内存,让代码执行之前,对当前作用域中带var和function的进行预解释 在浏览器解析执行代码的时候,会提前把带var和function的代码声明或定义,提前放在作用域的最前 ...

  6. js原型解释图

  7. echart.js 参数解释

    Data参数 获取容器对象 var canvas = document.getElementById("myCanvas"); 渲染 var ctx = canvas.getCon ...

  8. Node.js入门

    开始之前,安利一本正在看的书<站在两个世界的边缘>,作者程浩,上帝丢给他太多理想,却忘了给他完成理想的时间.OK,有兴趣的可以看一看. node.js如标题一样,我也是刚开始接触,大家一起 ...

  9. 使用Node.js+Socket.IO搭建WebSocket实时应用

    Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...

随机推荐

  1. LUA实现单词替换功能

    背景描述 编程或者文档处理过程, 经常遇到需要将一个单词修改为另外一个单词的情况, 例如 命名为 shall 修改 为 should. 使用工具实现, 则比较方便,不容易出错, 解放双手. 需求规格 ...

  2. mysqladmin note

    hr,fresh meat!! --------------------------------------------------- 15 Practical Usages of Mysqladmi ...

  3. !! 据说年薪30万的Android程序员必须知道事

    http://www.th7.cn/Program/Android/201512/742423.shtml Android中国开发精英 目前包括: Android开源项目第一篇——个性化控件(View ...

  4. c# winForm使用Aspose.Cells读取CSV文件中文乱码问题

    不废话直接上代码 主要注意是 红色代码部分 Aspose.Cells.TxtLoadOptions lo = new TxtLoadOptions();                      lo ...

  5. android webview 底层实现的逻辑

    其实在不同版本上,webview底层是有所不同的. 先提供个地址给大家查:http://grepcode.com/file/repository.grepcode.com/java/ext/com.g ...

  6. 【转】appStore上传苹果应用程序软件发布流程

    转载地址:http://blog.sina.com.cn/s/blog_68661bd801019uzd.html 首先确定帐号是否能发布, https://developer.apple.com/a ...

  7. noi 8787 数的划分

    题目链接:http://noi.openjudge.cn/ch0206/8787/ 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序). 简直跟分苹果一模一样. #include < ...

  8. 至强CPU性能排行,从X3210起,由低至高排列。

    X3210X3220E5410E5506X5355X3320E5507X5365E5-2603E3-1220LE5-2403E5607X3330L5506X3230L5420E5-2407W3520E ...

  9. 修改linux下某一个文件夹下所有文件内容

    find /data/app_resource -type f |xargs sed -i 's/192.168.220.126/192.168.221.160/g'

  10. Editplus配置VC++(1) 及相关注意事项

    下篇文章:Editplus配置VC++(2) 与/d1reportSingleClassLayout 原本用的是VC++2010 现在换成了Visual Studio 2013,editplus相关配 ...