zoukankan      html  css  js  c++  java
  • call、apply、bind一直是不求甚解!

    一直感觉代码中有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问题。
  • 相关阅读:
    HDU 4472 Count DP题
    HDU 1878 欧拉回路 图论
    CSUST 1503 ZZ买衣服
    HDU 2085 核反应堆
    HDU 1029 Ignatius and the Princess IV
    UVa 11462 Age Sort
    UVa 11384
    UVa 11210
    LA 3401
    解决学一会儿累了的问题
  • 原文地址:https://www.cnblogs.com/chenguangliang/p/10968971.html
Copyright © 2011-2022 走看看