zoukankan      html  css  js  c++  java
  • 关于call和apply的那点事儿

    在JavaScript中改变闭包中的this关键字中经常用到的就是call和apply了

    首先:call和apply的作用的区别是什么?

    答:call和apply 的作用是相同的。都是用来改变函数this值以及对函数传递相应的参数。区别是他们传值不同,call是一个一个的参数进行传值,即以散列的方式传值;而apply则是把所有的参数放到一个数组中,只传这个数组就足够了。。

    应用:在js中我们经常会用到数组的一些方法。但是类数组的形式却不能直接用数组的方法。那么我们就可以利用call和apply方法来间接的使用数组Array的方法

    enter code here                                                                                  
    var ary=[{name:"gudaochuan",age:22},{name:"super",age:48},{name:"man",age:38}];
    console.log([].sort.call(ary,function(a,b){return a.age-b.age;}));

    以下是上面数组输出的结果:enter image description here

    下面是一道面试题:据说是以前金山出的,现在应该没有这道题了:

    function fn1(){alert(1)};

    function fn2(){alert(2)};

    fn3=fn2.call; 
    fn2.call(fn1);
    //请问输出什么结果,为什么

    fn3.call(fn1);//请问输出什么结果,为什么

    fn2.call(fn1);这个没有什么可说的。fn2里面没有this,所以这里call(fn1)没什么意义。就相当于直接调用fn2()方法,弹出2

    主要是下面这个

    fn3=fn2.call;

    fn3.call(fn1);

    fn3=fn2.call是什么意思呢?

    *1.*call是定义在原型上的方法。所以说fn2.call只是这个call方法的定义......就和普通的一个方法的定义没有区别。所以fn2.call==fn3==Function.protoType.call

    Function.protoType.call是方法原型上的call方法

    所以fn3=fn1.call=fn2.call

    *2.*fn2.call(null); 这里fn2的this是谁, call里的this是谁

    fn2里面的this被强制转换成null了。call里的this就是fn2

    *3.*call是function类型的 call是原型的方法所以call是function类型的

    所以 call可以调用call方法

    fn3.call(fn1)==Function.call.call(fn1);

    最后一个注意的地方是:类上的方法this是谁就相当于谁在调用这个方法。所以说

    Function.call.call(fn1);

    Function.call 它里面的this指向fn1那么就相当于fn1.call

    那么fn3.call(fn1); 弹出1

  • 相关阅读:
    牛客网暑期ACM多校训练营(第三场)2018 A,PACM Team ( 01背包裸题 )
    牛客网暑期ACM多校训练营(第三场)2018 C , Shuffle Cards ( rope )
    简单的计算几何
    数论基本定理
    HDU-1698 Just a Hook
    HDU-1754 I Hate It ( 线段树入门 + update操作 )
    Base64
    openssl生成RSA非对称密钥---Windows
    AES-对称加密
    DES-对称加密
  • 原文地址:https://www.cnblogs.com/chengkun101/p/4179924.html
Copyright © 2011-2022 走看看