本系列作为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的指向

Effective JavaScript Item 21 使用apply方法调用函数以传入可变參数列表的更多相关文章

  1. Effective JavaScript Item 22 使用arguments来创建接受可变參数列表的函数

    本系列作为Effective JavaScript的读书笔记. 在Item 21中,介绍了结合apply方法实现的可变參数列表函数average,它实际上仅仅声明了一个数组作为參数,可是利用apply ...

  2. Effective JavaScript Item 55 接受配置对象作为函数參数

    接受配置对象作为函数參数 尽管保持函数接受的參数的顺序非常重要,可是当函数可以接受的參数达到一定数量时.也会让用户非常头疼: var alert = new Alert(100, 75, 300, 2 ...

  3. Effective JavaScript Item 63 注意异步调用中可能会被忽略的异常

    异常处理是异步编程的一个难点. 在同步的代码中,异常可以非常easy地通过try catch语句来完毕: try { f(); g(); h(); } catch (e) { // handle an ...

  4. Effective JavaScript Item 54 将undefined视为&quot;没有值&quot;

    将undefined视为"没有值" JavaScript中的undefined是一个特殊的值:当JavaScript没有提供详细的值时.它就会产生undefined. 比方: 未被 ...

  5. iOS 处理方法中的可变參数

    ## iOS 处理方法中的可变參数 近期写了一个自己定义的对话框的demo,想模仿系统的UIAlertView的实现方式.对处理可变參数的时候,遇到了小问题,于是谷歌了一下.写下了处理问题的方法.记录 ...

  6. 增强for循环、Map接口遍历、可变參数方法

    增强for循环 1.for循环能做得事情.增强for循环大部分都能做(假设要想获得下标的时候就必须使用简单for循环了) 2.增强for有时候可以方便的处理集合遍历的问题,可是集合的标准遍历是使用迭代 ...

  7. python可变參数调用函数问题

    一直使用python实现一些想法,近期在使用python的过程中出现这样一个需求,定义了一个函数.第一个是普通參数.第二个是默认參数,后面还有可变參数,在最初学习python的时候,都知道非keywo ...

  8. Effective JavaScript Item 38 调用父类的构造函数在子类的构造函数

    作为这一系列Effective JavaScript的读书笔记. 在一个游戏或者图形模拟的应用中.都会有场景(Scene)这一概念.在一个场景中会包括一个对象集合,这些对象被称为角色(Actor). ...

  9. Effective JavaScript Item 51 在类数组对象上重用数组方法

    Array.prototype对象上的标准方法被设计为也能够在其他对象上重用 - 即使不是继承自Array的对象. 因此,在JavaScript中存折一些类数组对象(Array-like Object ...

随机推荐

  1. android greenDao SQLite数据库操作使用的工具

    关于如何建立类生成一个演示project.今天介绍如何使用. 这是ExampleDaoGeneratorproject代码,做了一些改动 /* * Copyright (C) 2011 Markus ...

  2. 基于WEB 的认证防火墙的设计

    项目要求: 1.  采用Linux iptbles作为接入防火墙,默认放行所以访问入口的80端口 2.  访问者通过http://x.x.x.x 访问防火墙的认证系统,进行账号的登陆操作,同时系统对用 ...

  3. 可重入锁(good)

    可重入锁,也叫做递归锁,是指在一个线程中可以多次获取同一把锁,比如:一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法[即可重入],而无需重新获得锁: ...

  4. Java LinkedBlockingQueue和ArrayBlockingQueue分析

    LinkedBlockingQueue是一个链表实现的堵塞队列,在链表一头增加元素,假设队列满.就会堵塞.还有一头取出元素.假设队列为空.就会堵塞. LinkedBlockingQueue内部使用Re ...

  5. Android 启动过程的底层实现

    转载请标明出处:  http://blog.csdn.net/yujun411522/article/details/46367787 本文出自:[yujun411522的博客] 3.1 androi ...

  6. gcc的bug? c++模板类中友元函数的訪问权限问题

    原文地址:http://stackoverflow.com/q/23171337/3309790 在c++中,模板类中能够直接定义一个友元函数.该函数拥有訪问该模板类非public成员的权限. 比方: ...

  7. 获取不同机型外置SD卡路径

    /** * 运行挂载命令.返回挂载的地址.然后将地址解析 */ private void getExtSDCardPath() { try { Runtime runtime = Runtime.ge ...

  8. linux--档案权限与目录配置

    下面是最近学习档案权限与目录配置的一些知识点总结***博客园-邦邦酱好*** Linux最优秀的地方之一,就在于他的多人多任务环境.而为了让各个使用者具有较保密的档案数据,因此档案的权限管理就变的很重 ...

  9. session深入解读

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:尽管session机制在web应用程序中被採用已经非常长时间了.可是仍然有非常多人不清楚 ...

  10. uvalive4327(单调队列优化)

    这题我有闪过是用单调队列优化的想法,也想过有左右两边各烧一遍. 但是不敢确定,搜了题解,发现真的是用单调队列,然后写了好久,调了好久下标应该怎么变化才过的. dp[i][j] 表示走到第i行,第j个竖 ...