一直以来对bind()、apply()、call()这三个方法都模模糊糊的,现在有时间详细的看看这三个方法,并记录下来。

bind()

参考文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

  • 定义:

bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。

  • 用法:

func.bind(thisArg, arg1, arg2, ...)

var obj = {
a: 1,
b: 2,
getCount: function(c, d) {
return this.a + this.b + c + d;
}
};
window.a = window.b = 0;
var func1 = obj.getCount;
var func2 = obj.getCount.bind(obj);
console.log(func1(3, 4));//得到7
console.log(func2(3, 4));//得到10
  • 说明:

bind()是Function的一个方法,所以应该是一个a函数来调用bind,参数是可以有若干个如(d,e,f),调用了bind方法后会返回一个新的方法b,b = a.bind(c,d,e,f),新函数b调用时,实际调用的却是a,但this指针指向的的却是c,d,e,f会作为参数带到a函数里面;
在上例中,func1之所以得到7是因为func1的this指向的是window,func2调用时this指向的是obj,所以得到10。

  • 示例:
  1. 创建绑定函数(如上例):

     (function() {
    console.log(this.a);
    }.bind({
    a: 10
    }))()//输出10
    (function() {
    console.log(this.a);
    })()//输出undefined
  2. 偏函数:创建一个调用另一个部分——参数或变量已经预置的的函数——的函数的用法(拗口,看示例吧),说白了就是让一个函数拥有预设的初始参数
    //例1
    function list() {
    return Array.prototype.slice.call(arguments);
    }
    var list1 = list(1, 2, 3); // [1, 2, 3]
    var leadingThirtysevenList = list.bind(undefined, 37);//37作为list的预设的初始参数
    var list2 = leadingThirtysevenList(); // [37]
    var list3 = leadingThirtysevenList(1, 2, 3); // [37, 1, 2, 3]
    //例2
    function joinWords(a,b) {
    return [a,b].join(' ');
    }
    //不使用bind
    function prefixer(word) {
    return function(b) {
    return joinWords(word,b);
    }
    }
    var prefixWithHate = prefixer('Hate');
    console.log(prefixWithHate('Java'));//Hate Java
    //使用bind
    var prefixWithHate2 = joinWords.bind(window,"Hate");
    console.log(prefixWithHate2('Java'));//Hate Java
  3. 配合 setTimeout:如何用setTimeout连续打印0~9
    for(var i = 0; i < 10; i++) {//不使用bind
    (function(i) {
    setTimeout(function() {
    console.log(i);
    }, i * 1000);
    })(i);
    }
    for(var i = 0; i < 10; i++) {//使用bind
    setTimeout(console.log.bind(null, i), i * 1000);//给了console.log一个默认的参数i
    }

apply()、call()

参考文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

  • 定义:

apply() 方法调用一个函数, 其具有一个指定的this值,以及作为一个数组(或类似数组的对象)提供的参数。
call() 方法调用一个函数, 其具有一个指定的this值,以及分别地提供的参数(参数的列表)。

  • 用法:

fun.apply(thisArg, [argsArray])
fun.call(thisArg, arg1,arg2,arg3,...)

  • 说明:

fun调用apply方法是这样fun里面的this指针指向thisArg,[argsArray]是一个数组或是类数组(arguments)作为fun函数的参数;
call方法除了参数和apply不一样其他都相同。

  • 示例:
  1. 使用call/apply实现继承:

    function a1(b){
    this.b = b;
    this.c = function(){
    console.log(this.b);
    }
    }
    function a2(b){
    a1.apply(this,[b]);
    //a1.call(this,b);
    } var a3 = new a2(123);
    a3.c();//打印出123
  2. 使用apply和内置函数
    //得到最大值、最小值
    var arr = [5,6,9,11,0,1,3];
    var max = Math.max.apply(null,arr);
    var min = Math.min.apply(null,arr);
    console.log(max,min)//得到11,0

bind()、aplly()和call()的区别:

  • 返回值不同:调用bind()返回一个新的函数,aplly()和call()返回调用这两个方法的函数的返回值,如:
function add(a,b){
return a + b;
}
function sub(a,b){
return a - b;
}
var a1 = add.bind(sub,3,2);
var a2 = add.apply(sub,[3,2]);
var a3 = sub.call(add,3,2);
console.log(a1,a1(),a2,a3);//得到的是:ƒ add(a,b){return a + b;},5,5,1
  • 参数不同:bind()和call()的参数结构相同,都是this的新指向和一串参数,apply()的参数是this的新指向加一个数组或是类数组;

javascript中bind()、call()、apply()的使用的更多相关文章

  1. 面试官:能解释一下javascript中bind、apply和call这三个函数的用法吗

    一.前言    不知道大家还记不记得前几篇的文章:<面试官:能解释一下javascript中的this吗> 那今天这篇文章虽然是介绍javascript中bind.apply和call函数 ...

  2. 博文推荐】Javascript中bind、call、apply函数用法

    [博文推荐]Javascript中bind.call.apply函数用法 2015-03-02 09:22 菜鸟浮出水 51CTO博客 字号:T | T 最近一直在用 js 写游戏服务器,我也接触 j ...

  3. JavaScript函数 bind call apply区别

    1. apply calll 在JavaScript中 call 和 apply 都是为了改变某个函数运行时上下文而存在的, 换句话说就是为了改变函数内部的this的指向. 这里我们有一个新的对象 b ...

  4. JavaScript中call、apply个人理解

    JavaScript中call.apply个人理解 一句话即通俗的说:call.apply 是为了改变this的状态而存在的 }; } function personInfo(name,age){ t ...

  5. 说说 JavaScript中 call和apply

    下面有关JavaScript中 call和apply的描述,错误的是? call与apply都属于Function.prototype的一个方法,所以每个function实例都有call.apply属 ...

  6. Javascript中call,apply,bind方法的详解与总结

    在 javascript之 this 关键字详解 文章中,谈及了如下内容,做一个简单的回顾: 1.this对象的涵义就是指向当前对象中的属性和方法. 2.this指向的可变性.当在全局作用域时,thi ...

  7. Javascript中call、apply、bind函数

    javascript在函数创建的时候除了自己定义的参数外还会自动新增this和arguments两个参数 javascript中函数也是对象,call.apply.bind函数就是函数中的三个函数,这 ...

  8. Javascript中call,apply,bind的区别

    一.探索call方法原理 Function.prototype.call = function(obj) { // 1.让fn中的this指向obj // eval(this.toString().r ...

  9. 深入浅出:了解JavaScript中的call,apply,bind的差别

     在 javascript之 this 关键字详解文章中,谈及了如下内容,做一个简单的回顾:         1.this对象的涵义就是指向当前对象中的属性和方法.       2.this指向的可变 ...

随机推荐

  1. shell编程系列7--shell中常用的工具find、locate、which、whereis

    shell编程系列7--shell中常用的工具find.locate.which.whereis .文件查找之find命令 语法格式:find [路径] [选项] [操作] 选项 -name 根据文件 ...

  2. ISO/IEC 9899:2011 条款6.8.4——选择语句

    6.8.4 选择语句 语法 1.selection-statement: if    (    expression    )    statement if    (    expression   ...

  3. C++数据存储方式

    1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区,里面的变量通常是局部变量.函数参数等. 2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去 ...

  4. Python - Django - 模板语言之 Tags(标签)

    标签使用 {% %} 注释语句:{# #} for 循环: views.py: from django.shortcuts import render, redirect, HttpResponse ...

  5. docker进入容器内部执行命令

    [root@bogon ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 38a2cae4c32f jenk ...

  6. 【 argo 和 kubectl 】

    argo submit --watch xxx.yaml [ --kubeconfig xxx.conf  --namespace xxx ] argo list [ --kubeconfig xxx ...

  7. 使用jsPlumb插件实现动态连线功能

    这周去看了两天的羽毛球亚锦赛,工作有提前晚上加班做一些,但是技术文章却拉下了. 这段时间一直在寻找可以实现前端元素动态连线的功能,找了好几个库,考虑过用d3或者原生svg和canvas来实现,最后和同 ...

  8. AMSR-E/AMSR-2数据介绍与下载

    1 AMSR-E数据介绍 The Advanced Microwave Scanning Radiometer for EOS (AMSR-E)是ADEOS-II 上的AMSR的改进版本, 是JAXA ...

  9. 【神经网络与深度学习】【计算机视觉】RCNN- 将CNN引入目标检测的开山之作

    转自:https://zhuanlan.zhihu.com/p/23006190?refer=xiaoleimlnote 前面一直在写传统机器学习.从本篇开始写一写 深度学习的内容. 可能需要一定的神 ...

  10. OneNote中更改英文输入默认不是微软雅黑的问题

    win10下的终极版解决方案: 1.进入C:\Windows\Fonts找到Calibri字体,点进去后先右键Calibri常规-属性-安全-高级,将所有者从“TrustedInstaller”更改为 ...