在JavaScript中,apply、call、bind这个三个方法,它们的作用都是为了改变某个函数运行时的上下文,

也就是改变函数体内的this指向。

在一个函数里,存在“定义时上下文”、“运行时上下文”,而且上下文是可以改变的。

apply方法

apply方法接收两个参数,第一个参数是:“上下文对象” ,第二个参数是:“传入当前执行函数的参数”(第二个参数是数组)。

        function test(){
console.log(this.name);
} let one = {
name:'测试1'
} let two = {
name:'测试2'
} test.apply(one);//将one对象传入函数 这时test函数的上下文是one ,one的name等于'测试1' 所以输出 '测试1'
test.apply(two);//将two对象传入函数 这时test函数的上下文是two ,two的name等于'测试2' 所以输出 '测试2'

我们自己封装一个log函数,将传入的参数打印在控制台。

        function log(){
var arr = Array.prototype.slice.apply(arguments);
console.log.apply(console,arr);
} log(1,2,4);

call方法

call和apply作用都是一样的,唯一的不同点是第二个参数,apply的第二个参数是数组,而call的第二个参数的话,看下面例子:

        var arr = [1,2,3];
Array.prototype.push.call(arr,6,7,8); //参数是一个一个传的
console.log(arr);//[1, 2, 3, 6, 7, 8]

bind方法

bind方法和apply、call的作用也是差不多的,不同的是 apply、call 这两个方法是立即执行函数,而bind不是,来看下面例子:

        let one = {
name:'测试1'
}
let two = {
name:'测试2'
} function sayName(){
console.log(this.name);
} let play = sayName.bind(one); //这里并不会立即执行
play(); //所以 可以将这个方法 放到需要的地方 在执行

apply、call、bind这三者的区别

相同点:这个三个方法的作用都是改变函数执行上下文。

不同点:bind是返回对应的函数,便于稍后调用,apply、call方法则是立即执行(立即调用)

参考教程:https://www.cnblogs.com/moqiutao/p/7371988.html

《JavaScript总结》apply、call和bind方法的更多相关文章

  1. 彻底理解了call()方法,apply()方法和bind()方法

    javascript中的每一个作用域中都有一个this对象,它代表的是调用函数的对象.在全局作用域中,this代表的是全局对象(在web浏览器中指的是window).如果包含this的函数是一个对象的 ...

  2. 浅析 JavaScript 中的 Function.prototype.bind() 方法

    Function.prototype.bind()方法 bind() 方法的主要作用就是将函数绑定至某个对象,bind() 方法会创建一个函数,函数体内this对象的值会被绑定到传入bind() 函数 ...

  3. JavaScript 中的 Function.prototype.bind() 方法

    转载自:https://www.cnblogs.com/zztt/p/4122352.html Function.prototype.bind()方法 bind() 方法的主要作用就是将函数绑定至某个 ...

  4. Javascript中this作用域以及bind方法的重写

    这是一个最近遇到的笔试题,出于尊重,不会说出该公司的名字,源于自身比较少,笔试题是将bind方法用ES3重写,使用bind这个方法,导致一时半会懵了,只记得bind可以改变this的作用域. 作为查漏 ...

  5. JavaScript的apply()方法和call()方法

    1 <script type="text/javascript"> 2 /*定义一个人类*/ 3 function Person(name,age) 4 { 5 thi ...

  6. JavaScript中apply与call方法

    一.定义 apply:应用某一对象的一个方法,用另一个对象替换当前对象. call:调用一个对象的一个方法,以另一个对象替换当前对象. 二.apply //apply function Person( ...

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

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

  8. javascript中函数的call,apply及bind方法

    call 方法调用一个对象的一个方法,以另一个对象替换当前对象.call([thisObj[,arg1[, arg2[,  [,.argN]]]]])参数thisObj可选项.将被用作当前对象的对象. ...

  9. javascript中apply、call和bind的区别及方法详解

    文章目录   apply.call apply.call 区别 apply.call实例 数组之间追加 获取数组中的最大值和最小值 验证是否是数组(前提是toString()方法没有被重写过) 类(伪 ...

随机推荐

  1. sui.js和workflow2.js内容详解

    一. 二. var config=$("div[name=lwnf]").sui().getConfig()~var config = this.zoo.getConfig();等 ...

  2. maven跳过测试编译命令

    mvn clean install/package/deploy -Dmaven.test.skip=true

  3. 用pandas库修改excel文件里的内容,并把excel文件格式存为csv格式,再将csv格式改为html格式

    假设有Excel文件data.xlsx,其中内容为: ID  age  height     sex  weight张三   1   39     181  female      85李四   2  ...

  4. JPA-04

    一.JPQL JPA的查询语言(和SQL非常像,面向对象的查询语言) 有list集合可以用size看长度 分页:setFirstResult().setMaxResults(); 获取总条数:getS ...

  5. Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring

    Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring 非原创[只为记录],原博文地址:https://www.cnblogs.com/ ...

  6. Liang-Barsky直线段裁剪算法

    Liang-Barsky直线段裁剪算法 梁友栋与Barsky提出的裁剪算法以直线的参数方程为基础,把判断直线段与窗口边界求交的 二维裁剪问题转化为求解一组不等式,确定直线段参数的一维裁剪问题.设起点为 ...

  7. 修改云主机windows密码不生效

    Step1:使用文本工具打开插件路径: 路径为:C:\Program Files\Cloudbase Solutions\Cloudbase-Init\Python\Lib\site-packages ...

  8. 《DevOps软件架构师行动指南》读后感

    从软件架构师视角讲解了引入DevOps实践所需要拥有的技术能力,涵盖运维.部署流水线.监控.安全与审计以及质量关注,这是本书一开始内容简介的开头,本书的作者是伦恩·拜斯(Len Bass).英戈·韦伯 ...

  9. 记一次bash脚本开发的经历

    现状描述与需求描述 最近梳理系统功能的时候发现现在每个月处理完数据之后,需要给别的系统传送批接口文件,接口文件的内容是来自于Oracle数据表中的数据.我每次都需要手工执行一下存储过程,让数据从正式表 ...

  10. Centos 安装 mysql tar.gz

    http://www.cnblogs.com/coderls/p/6848873.html