zoukankan      html  css  js  c++  java
  • 浅谈JavaScript中的call和apply

    语法

    fun.apply(thisArg, [argsArray])
    
    fun.call(thisArg, arg1, arg2, ...)

    apply 接收两个参数,第一个参数指定了函数体内this对象的指向,第二个参数为带下标的集合,这个集合可以为数组,也可以为类数组,apply 方法把这个集合总的元素传递给被调用的函数。

    call是包装在apply上的语法糖,如果知道具体多少个参数,可以使用call来传递参数,方便表达形参和实参的对应关系。

    往往apply和call容易记混淆,不妨使用联想记忆:

    apply ->array  //字母开头都是a

    只要看到apply就会想到接收的是array。apply接收数组或类数组对象,而call接收参数列表。

    用途

    1.改变this的指向

    简单来说就是当 fun函数运行时,指定this的值 为 thisArg。

    var a = 10,b = 20;
     function add(c,d){
         return this.a + this.b + c +d;
     }
          
    var o ={a:1,b:2};
    
    add(3,4); // 10 + 20 + 3 + 4 = 37
    add.call(o,3,4); // 1 + 2 + 3 + 4 = 10
    add.apply(o,[3,4]); // 1 + 2 + 3 + 4 = 10


    上面的例子可以看出
     

    当直接调用add时,this指向 window;
    当使用call、apply时,this指向了o;

    2.借用其他对象方法

    当一个object对象没有某个方法,可以借助call或apply用其它对象的方法来实现。

    function Cat(){
    
    }
    Cat.prototype = {
        voice:"miao~miao~",
        say: function () {
            console.log("I can say "+ this.voice);
        }
    };
    var writeCat = new Cat();
    writeCat.say();  //  I can say miao~miao~
    
    //dog
    var yellowDog = {voice:"wang~wang~"};
    writeCat.say.call(yellowDog); // I can say wang~wang~

    关于thisArg

    thisArg 是对象类型。
    当指定的thisArg不是对象类型时,会先转成相应的对象类型,再进行后续程序。

    function foo(x,y){
        console.log(x,y,this);
    }
        
    foo.call(100,1,2);   // 1 2 Number {}
    foo.call(true,1,2);  // 1 2 Boolean {}
    foo.call('string',1,2); //  1 2 String { 0="s",  1="t",  2="r",  更多...}
    foo.call(null);      //undefined undefined Window
    foo.call(undefined);  //undefined undefined Window

    当指定为null和undefined时,函数内的this会指向默认的宿主对象,在浏览器里是Window,但当在严格模式时,则不进行转化。

  • 相关阅读:
    过滤指定目录下指定后缀名文件
    Oracle 存储过程创建表
    编码测试之控制条件筛选心得——AE二次开发篇
    log4j配置祥解 (转)
    手机浏览器的viewport(视觉窗口)
    git 常用技巧
    添加eclipse的字体样式
    如何检测android 文件签名成功(转帖)
    javascript 解析json
    身份证正则表达式
  • 原文地址:https://www.cnblogs.com/eboke/p/4641686.html
Copyright © 2011-2022 走看看