• Effective JavaScript Item 21 使用apply方法调用函数以传入可变參数列表


    本系列作为Effective JavaScript的读书笔记。

     

    以下是一个拥有可变參数列表的方法的典型样例:


    average(1, 2, 3); // 2
    average(1); // 1
    average(3, 1, 4, 1, 5, 9, 2, 6, 5); // 4
    average(2, 7, 1, 8, 2, 8, 1, 8); // 4.625
    

    而下面则是一个仅仅接受一个数组作为參数的样例:


    averageOfArray([1, 2, 3]); // 2
    averageOfArray([1]); // 1
    averageOfArray([3, 1, 4, 1, 5, 9, 2, 6, 5]); // 4
    averageOfArray([2, 7, 1, 8, 2, 8, 1, 8]); // 4.625
    

    毫无疑问,拥有可变參数列表的方法更加简洁和灵活,它能够处理随意多的參数。可是当參数是一个数组时,怎样调用拥有可变參数列表的方法呢?

     

    答案是使用内置的apply方法,这种方法和call方法十分类似,除了apply方法是接受一个数组作为參数,然后会将该数组中的每一个对象当成单独的參数进行调用。同一时候,apply方法的第一个參数同call方法的第一个參数意义一样,用来指定this的指向。所以,结合apply方法,就能够处理数组类型的參数了:


    var scores = getAllScores();
    average.apply(null, scores);
    

    如果scores是一个拥有三个元素的数组,那么上述调用实际上就是:


    average(scores[0], scores[1], scores[2]);
    

    还有一个样例是将apply运用到依赖arguments变量的方法中,关于arguments变量的意义和使用方法,參见Item 22


    var buffer = {
    	state: [],
    	append: function() {
    		for (var i = 0, n = arguments.length; i < n; i++) {
    			this.state.push(arguments[i]);
    		}
    	}
    };
    

    append方法能够使用随意多的參数进行调用,由于它在实现中依赖了arguments变量:


    buffer.append("Hello, ");
    buffer.append(firstName, " ", lastName, "!");
    buffer.append(newline);
    

    使用apply方法后,能够这样调用:


    buffer.append.apply(buffer, getInputStrings());
    

    须要注意的是,在调用apply的时候,传入了buffer对象作为this的指向,这是由于在append的实现中依赖了this变量,须要显式传入该依赖才干确保改动发生在了正确的对象上。

     

    总结:

    1. 使用apply方法来将数组类型的參数传入到接受可变參数列表的方法中
    2. 使用apply方法的第一个參数来指定this的指向

  • 相关阅读:
    一些技术鸡汤
    css优化
    Spring 通过maven pom文件配置初始化
    sql 编写横竖表转换
    Linux 常用命令笔记 (持续更新)
    java常用集合详解 contains
    jQuery Ajax(异步请求)
    java中"与"和"或"
    java8 中的时间和数据的变化
    mysql 根据查询结果集更新
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4326867.html
Copyright © 2020-2023  润新知