zoukankan      html  css  js  c++  java
  • call()和apply()的区别

    ECMAScript 规范给所有函数都定义了 call 与 apply 两个方法,它们的应用非常广泛,它们的作用也是一模一样,只是传参的形式有区别而已。

    apply( )

    apply 方法传入两个参数:一个是作为函数上下文的对象,另外一个是作为函数参数所组成的数组。

    var obj = {
        name : 'linxin',
    }
    function func(firstName, lastName){
        console.log(firstName + ' ' + this.name + ' ' + lastName);
    }
    func.apply(obj, ['A', 'B']); // A linxin B
    
    

    可以看到,obj 是作为函数上下文的对象,函数 func() 中 this 指向了 obj 这个对象。参数 A 和 B 是放在数组中传入 func() 函数,分别对应 func()参数的列表元素

    call( )

    call 方法第一个参数也是作为函数上下文的对象,但是后面传入的是一个参数列表,而不是单个数组。

    
    var obj = {
        name: 'linxin'
    }
    
    function func(firstName, lastName) {
        console.log(firstName + ' ' + this.name + ' ' + lastName);
    }
    
    func.call(obj, 'C', 'D');  // C linxin D	
    

    对比 apply 我们可以看到区别,C 和 D 是作为单独的参数传给 func 函数,而不是放到数组中。

    对于什么时候该用什么方法,其实不用纠结。如果你的参数本来就存在一个数组中,那自然就用 apply,如果参数比较散乱相互之间没什么关联,就用 call。

    以上内容来源于github上https://github.com/lin-xin/blog/issues/7


    以上不管哪一种如果使用arguments实参列表,使用方法都一样

    
    var obj = {
        name: 'linxin'
    }
    
    function func(firstName, lastName) {
        console.log(arguments[0] + ' ' + this.name + ' ' + arguments[1] );
    }
    
    func.call(obj, 'C', 'D');  // C linxin D	
    
    //使用arguments看的只是他的实参列表;不管你是数组还是参数列表都一样
    var obj = {
        name: 'linxin'
    }
    
    function func(firstName, lastName) {
        console.log(arguments[0] + ' ' + this.name + ' ' + arguments[1] );
    }
    
    func.apply(obj, 'C', 'D');  // C linxin D
    
    君子慎独,修己以安人
  • 相关阅读:
    算术运算符
    JAVA文件名命名规范
    JAVA构造函数的继承
    JAVA构造函数(方法)
    JAVA中的继承
    Linux下复制一个文件夹下文件到另外一个目录
    ISO-8601及GMT时间格式
    线程池执行任务后,返回值接收(转载)
    SpringBoot -> @Import引入配置类 @ImportResource引入xml配置文件
    Spring Boot与Spring Security整合后post数据不了,403拒绝访问
  • 原文地址:https://www.cnblogs.com/yohe/p/12196076.html
Copyright © 2011-2022 走看看