• bind、apply、call的理解


    一直感觉代码中有call和apply就很高大上(看不懂),但是都草草略过,今天非要弄明白!
    以前总是死记硬背:call、apply、bind 都是用来修改函数中的this,传参时,call是一个个传参,apply是数组形式传参,call和apply立即执行并且返回值是你调用的方法的返回值,若该方法没有返回值,则返回undefined。bind是改变this后返回一个新的函数,他不会立即执行。
    死记硬背的结果就是:总以为这三个方法改变了原方法的this,原方法的this就永久改变了!大错特错啊!!

    1.提出问题:看到好多call使用场景,就是不求甚解!
    例1:Object.prototype.toString.call(arguments) 用来精确判断数据类型:"[object Array]" 或者 "[object Object]"
    例2:Array.slice.call(类数组) 或者 [].slice.call(类数组) 用来把类数组转为数组,其实这里就是让类数组使用一下不属于自己的方法slice

    2.验证问题:看看apply的用法 (别人写的)
    function people(age,sex){
    this.age=age;
    this.sex=sex;
    };
    function adult(age,sex){
    people.apply(this,arguments)
    };
    var jack = new adult(18,'man');
    console.log(jack.age+":"+jack.sex)
    输出为 18:man
    其实看到这段代码就知道apply怎么用了吧。
    其实apply说到底就是为了使一个对象可以使用不属于自己的方法,

    3. 扩展(填坑之路):我想自己写一下验证apply会不会改变this,如下(自己写的)
    function fn() {
    console.log(this);
    }
    var obj={a:[4,5,6],b:[7,8]};
    fn.apply(obj); // {a: Array(3), b: Array(2)}
    var f=new fn(); // { }

    郁闷:倒数第二行我不是用fn.apply(obj)改了fn的this指向为obj了么,为什么最后一行new出来的对象是空的?不应该是带a和b属性么?
    答案:你只是用fn.apply(obj)执行了一把fn,执行时顺便把fn中的this改成了obj而已,然后把结果输出,这并不会改变fn原函数啊。
         否则调用一次 Array.slice.call(类数组) ,难道就要把数组的slice方法里的this永久修改为传入的参数 类数组 么!那不是疯了么!

    以后这样死记硬背:call、apply、bind 是Function.prototype下的方法,作用是执行一下目标函数,执行时顺便把目标函数中的this改一下,然后把结果输出,执行后,不会影响原函数!
    题外话:如果你的代码也想用这三个方法,你就要学习数组的slice写法,里面的逻辑都考虑到this问题。

     
     
    摘自: - 方便以后复习 - 博客园 
    地址: https://www.cnblogs.com/chenguangliang/p/10968971.html
  • 相关阅读:
    TypeScript完全解读(26课时)_7.ES6精讲
    Flutter实战视频-移动电商-66.会员中心_编写ListTile通用方法
    Residual Networks <2015 ICCV, ImageNet 图像分类Top1>
    Coursera《machine learning》--(14)数据降维
    C# webbrowser遍历网页元素
    查询某表空间被哪些用户所使用
    C 语言运算符优先级(记忆口诀)
    建立简单的哈希表
    【LeetCode-面试算法经典-Java实现】【168-Excel Sheet Column Title(Excell列标题)】
    计算随意无序字符串中的最大有序串
  • 原文地址:https://www.cnblogs.com/ning123/p/11029126.html
Copyright © 2020-2023  润新知