2020-03-19
call,apply,bind的理解
先说区别call, apply基本上没什么不一样,唯一不一样的地方是传参方式不同 但是bind和call,apply有区别。bind是重新绑定this但是不执行,而apply,call都是绑定完立即执行 举个栗子
function add(a, b) {
return a + b;
} function sub(a, b) {
return a - b;
} // apply传参是传一个数组 call是一个一个的传,这就是他们俩的区别
let result1 = add.apply(sub, [1, 2]); //
let result2 = add.call(sub, 1, 2); //
let result3 = sub.apply(add, [1, 2]); // -1
let result4 = sub.call(sub, 1, 2); // -1 // bind和apply,call不一样的是它不算立即执行,传参方式和call一样
let result5 = add.bind(sub, 1, 2)();
call,apply的理解:
1: 实际上是继承
Dog.apply(cat); 就是cat继承了Dog这个构造函数中的所有内容
function Dog(age) {
this.name = 'dog';
this.showName = function () {
console.log('this is a ' + this.name + age);
}
} function Cat(age) {
this.name = 'cat';
this.showName = function () {
console.log('this is a ' + this.name + age);
}
} let cat = new Cat(18);
Dog.apply(cat, [100]); // cat继承了Dog这个构造函数中的所有内容 cat.showName(); // this is a dog100
console.log(cat.name); // dog

还可以多重继承!!!

function Sub(){
this.showSub = function(a,b){
console.log(a - b);
}
} function Add(){
this.showAdd = function(a,b){
console.log(a + b);
}
} function MathUtils(){
Sub.apply(this);
Add.apply(this);
// Sub.call(this);
//Add.call(this);
} var mathTool = new MathUtils();
mathTool.showSub(1,2); // -1
mathTool.showAdd(1,2); //
 
2: 位置很关键
调用apply,call的位置决定了最后的结果
function Dog() {
this.name = 'dog';
this.showName = function () {
console.log('this is a ' + this.name);
}
} function Cat() {
// Dog.call(this);
// 如果是在最开始就写Dog.call(this);
// 那么下面Cat本身的this.name = 'cat'会把call继承的this.name = 'dog'覆盖;也就不会有变化
this.name = 'cat';
Dog.call(this);
// Dog.call(this); 相当于在这个位置把Dog的代码复制过来
// 也就是相当于在这里写入了
// this.name = 'dog';
// this.showName = function () {...}
// 显然 这里的this.name = 'dog'会把上面的this.name='cat'覆盖
this.showName = function () {
console.log('this is a ' + this.name);
}
}
 

call,apply,bind的理解的更多相关文章

  1. 理解 JavaScript call()/apply()/bind()

    理解 JavaScript this 文章中已经比较全面的分析了 this 在 JavaScript 中的指向问题,用一句话来总结就是:this 的指向一定是在执行时决定的,指向被调用函数的对象.当然 ...

  2. 学习前端的菜鸡对JS的call,apply,bind的通俗易懂理解

       call,apply,bind 在JavaScript中,call.apply和bind是Function对象自带的三个方法,都是为了改变函数体内部 this 的指向.            a ...

  3. call,apply,bind的理解

    call,apply,bind均是用于改变this指向. 三者相似之处: 1:都是用于改变函数的this指向. 2:第一个参数都是this要指向的对象. 3:都可以通过后面的参数进行对方法的传参. l ...

  4. call,apply,bind的用法

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

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

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

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

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

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

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

  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. linux常用命令---yum 工具

    yum 工具 yum工具是红帽子才有的软件管理工具,例如suse乌班图等系统,没有yum,apt-get apt-install

  2. zz MySQL redo log及recover过程浅析

    原作地址:http://www.cnblogs.com/liuhao/p/3714012.html 写在前面:作者水平有限,欢迎不吝赐教,一切以最新源码为准. InnoDB redo log 首先介绍 ...

  3. 程序员使用IDEA这些插件后,办公效率提升100%(持续更新中)

    IDEA一些不错的插件分享 目录 IDEA一些不错的插件分享 插件集合 CamelCase Translation LiveEdit MarkDown Navigator Jrebel CheckSt ...

  4. 【持续更新】springboot相关配置

    @Configuration public class MyWebMvcConfig implements WebMvcConfigurer { //注册了新的访问路径 @Override publi ...

  5. mysql 的大文本存储TEXT & BLOB

    TEXT & BLOB 一般在保存少量字符串的时候,我们会选择 CHAR 或者 VARCHAR:而在保存较大文本时,通常会选择使用 TEXT 或者 BLOB,二者之间的主要差别是 BLOB 能 ...

  6. vue 基于elment UI tree 组件实现带引导、提示线

    实现样式 准备工作,先实现 树状组件的基本样式 <span style="height:500px; display:block; overflow-y:auto;" cla ...

  7. RabbitMQ(1)---基本概念

    一.安装RabbitMQ 安装直接用docker安装,如果手动安装的话比较繁琐,还要安装erlang语言的环境.在安装有docker机器上执行官网提供的指令(https://www.rabbitmq. ...

  8. 重磅!阿里P8费心整理Netty实战+指南+项目白皮书PDF,总计1.08G

    前言 Netty是一款用于快速开发高性能的网络应用程序的Java框架.它封装了网络编程的复杂性,使网络编程和Web技术的最新进展能够被比以往更广泛的开发人员接触到. Netty不只是一个接口和类的集合 ...

  9. 使用fileupload组件

    1. 进行文件上传时, 表单需要做的准备: 1). 请求方式为 POST: <form action="uploadServlet" method="post&qu ...

  10. 【转】shell的反引号、单引号、双引号的作用

    Linux Shell中有三种引号,分别为双引号(" ").单引号(' ')以及反引号(` `). 其中双引号对字符串中出现的$.''.`和\进行替换:单引号不进行替换,将字符串中 ...