简要概括:

apply(): 将函数作为指定对象的方法来调用,传递给它的是指定的参数数组
     ——function.apply(thisobj, args) 或者 function.apply(thisobj, args) bind(): 主要作用:将函数绑定到一个对象,返回一个新函数,通过可选的指定参数,作为指定对象的方法调用该方法
     ——function.bind(o) 或者是function.bind(o, args...); call(): 类似apply,将函数作为指定对象的方法来调用,传递给它的是指定参数
     ——function.call(thisobj, args.....)

apply


function.apply(thisobj, args)

  1、thisobj是调用function的对象,函数体内thisobj为this,如果参数为null则使用全局对象

  2、返回调用函数function的返回值

eg:

var data = [1, 2, 3, 4, 5];
Math.max.apply(null, data); // var data = [1, 2, 3, 4, 5];
console.log(data.toString()); //1,2,3,4,5
//将默认的toString方法应用到一个对象上
Object.prototype.toString.apply(data); //"[object Array]"

call


function.call(thisobj, args...)——和apply用法类似,只是传递的参数不是数组

  1、thisobj是调用function的对象,函数体内thisobj为this,如果参数为null则使用全局对象

  2、返回调用函数function的返回值

eg:

//call
var data = [1, 2, 3, 4, 5];
Math.max.call(null, data); //NAN
Math.max.call(null, 1, 2, 3, 4, 5); // var data = [1, 2, 3, 4, 5];
Object.prototype.toString.call(data); //"[object Array]"
Object.prototype.toString.call(1); //"[object Number]"

bind


function.bind(o, args)

  1、o要绑定在函数上的对象

  2、args...要绑定在函数上的零个或者是多个函数值

  3、返回一个新函数,该函数会当做o的方法调用,并向它传入args参数

eg1:

//bind
var sum = function( y){
return this.x + y;
}
var obj = {x: 1};
var objSum = sum.bind(obj);
objSum(3); //

eg2:

function sum(){
var result=0;
for(var i=0, n=arguments.length; i<n; i++){
result += arguments[i];
}
return result;
} var newSum = sum.bind(null, 1); //此处this值绑定到null,第一个参数绑定到1
newSum(2); //
newSum(2, 3, 4); //

eg3:

function sum(){
var result=0;
for(var i=0, n=arguments.length; i<n; i++){
result += arguments[i];
}
return result;
} var newSum = sum.bind(null, 1, 2); //此处this值绑定到null,第一个和第二个参数绑定到1、2
newSum(2); //
newSum(2, 3, 4); //

例2和例3中包含了函数柯里化(currying)的思想,即将函数的默认参数和可变参数结合, 把接受多个参数的函数变换成接受一个单一参数的函数,并返回接受新函数,这个新函数能够接受原函数的参数。

currying主要功能是通过已有的函数动态创建函数,创建的新函数仍然通过已有的函数发生作用,只是通过传入更过的参数来简化函数的参数方面的调用

另外, 柯里话在DOM的回调函数中用的很多

eg1:

var curry = function(fn){
var args = Array.prototype.slice.call(arguments, 1);
return function(){
return fn.apply(null, args.concat(Array.prototype.slice.call(arguments)));
}
}
function sum(){
var result=0;
for(var i=0, n=arguments.length; i<n; i++){
result += arguments[i];
}
return result;
} var newSum= curry(sum, 1, 2);
newSum= newSum(1, 2, 3); //

eg2:

var curry = function(fn){
var args=[];
return function(){
if(arguments.length){
[].push.apply(args,arguments);
return arguments.callee;
}else{
return fn.apply(this,args);
}
}
}; function sum(){
var result=0;
for(var i=0, n=arguments.length; i<n; i++){
result += arguments[i];
}
return result;
} var newSum= curry(sum);
newSum= newSum(1)(2)(3);
newSum(); //
newSum(4)(); //

了解更多currying可参考链接1链接二

另外, bind是ECMAScript5中新增的方法,在ECMAScript3中可以采用如下方式使用:

bind是ECMAScript5中新增的方法,在ECMAScript3中可以采用如下方式使用:

function bind(f, o){
if(f.bind){
return f.bind(o);
}else{
return function(){
return f.apply(o, arguments);
}
}
}

call, apply && bind, currying的更多相关文章

  1. Function.apply.bind()与Function.apply.bind()

    1.Function.apply.bind(…) 我在学习promise部分的时候遇到了这样的代码: Promise.resolve([10,20]).then(Function.apply.bind ...

  2. call,apply,bind的用法

    关于call,apply,bind这三个函数的用法,是学习javascript这门语言无法越过的知识点.下边我就来好好总结一下它们三者各自的用法,及常见的应用场景. 首先看call这个函数,可以理解成 ...

  3. JavaScript中call,apply,bind方法的总结。

    why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之前,通常会有这些问题. var a = { user:"追梦子", fn:f ...

  4. call(),apply(),bind()与回调

    1.call(),apply(),bind()方法 JavaScript 中通过call或者apply用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定 ...

  5. JS 的 call apply bind 方法

    js的call apply bind 方法都很常见,目的都是为了改变某个方法的执行环境(context) call call([thisObj[,arg1[, arg2[,   [,.argN]]]] ...

  6. javascript-this,call,apply,bind简述2

    上节我们一起研究了this这个小兄弟,得出一个结论,this指向调用this所在函数(或作用域)的那个对象或作用域.不太理解的朋友可以看看上节的内容,这次我们主要探讨一下call(),apply(), ...

  7. javascript-this,call,apply,bind简述1

    最近在系统的学习面向对象方面的知识,遇到的最大拦路虎就数this的指向,call,apply,bind函数的使用,单独抽出一天时间把这几个烦人的家伙搞定,去学习更深入的内容. 首先介绍一下this的一 ...

  8. call,apply,bind方法的总结

    why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之前,通常会有这些问题. var a = { user:"追梦子", fn:f ...

  9. JavaScript中call,apply,bind方法的总结

    原文链接:http://www.cnblogs.com/pssp/p/5215621.html why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之 ...

随机推荐

  1. uploadify插件实现多个图片上传并预览

    使用uploadify插件可方便实现图片上传功能.兼容ie6.ie7. 上传成功之后使用插件的回调函数读取json数据,根据url实现图片预览. 效果图: 点击浏览文件上传图片,图片依次在右侧显示预览 ...

  2. TSQL Beginners Challenge 3 - Find the Factorial

    这是一个关于CTE的应用,这里我们用CTE实现阶乘 Factorial,首先来看一个简单的小实验,然后再来看题目.有的童鞋会问怎么没有2就来3了呢,惭愧,TSQL Beginners Challeng ...

  3. maven项目下tomcat直接启动不了(LifecycleException)。报错如下截图

    经查,tomcat项目下的lib中没有jar包,发布的时候没有将jar包发布上去.这个问题在我的博客中以前遇到过.如何将maven的jar发布到项目中,我的博客里面有记载

  4. angularjs modal模态框----创建可拖动的指令

    //最近项目中需要将angular-ui-bootstrap中用到的弹出框,使之可拖动,由于源文件中没有实现,需要自己实现指令,以下即为该指令,亲测可以实现..directive('draggable ...

  5. Asp.net MVC利用Ajax.BeginForm实现bootstrap模态框弹出,并进行前段验证

    1.新建Controller public ActionResult Index() { return View(); } public ActionResult Person(int? id) { ...

  6. 在万网虚拟主机上部署MVC5

    参考 要想部署mvc,需要把一些mvc用到的全局程序集改为本地部署,通过N次试验,终于搞定. 特写个备忘录,免得以后忘了. 首先更改web.config,在里面加上 <system.web> ...

  7. yii2源码学习笔记(六)

    Behvaior类,Behavior类是所有事件类的基类: 目录yii2\base\Behavior.php <?php /** * @link http://www.yiiframework. ...

  8. mac 自带 php 验证码 不显示

    curl -s http://php-osx.liip.ch/install.sh | bash -s 5.5 在命令行中输入上面   ,最后5.5是php版本号 自动安装FreeType ----- ...

  9. python运维开发之路第一天

    一.python安装及环境变量配置 1.windows7安装python 1)下载地址:https://www.python.org/downloads/windows/ 如下图: 注意:下载,用代理 ...

  10. js动态加载脚本

    最近公司的前端地图产品需要做一下模块划分,希望用户用到哪一块的功能再加载哪一块的模块,这样可以提高用户体验. 所以到处查资料研究js动态脚本的加载,不过真让人伤心啊!,网上几乎都是同一篇文章,4种方法 ...