关于apply的应用

从一道js编程题开始:

实现函数 callIt,调用之后满足如下条件

1、返回的结果为调用 fn 之后的结果

2、fn 的调用参数为 callIt 的第一个参数之后的全部参数

正确实现:

function callIt(fn) {

//获取除了fn以外的所有参数

 var newArr = Array.prototype.slice.call(arguments,1);

//执行fn并将newArr这个数组里面的数据作为参数传给fn

    return fn.apply(this,newArr);

}

我的疑问实现:

function callIt(fn) {

    var newArr = Array.prototype.slice.call(arguments,1);

//如果这样实现的话,newArr会直接以数组的形式传入,而不是分成一个一个的参数

    return fn(newArr);

}

测试:

function callIt(fn) {

    var newArr = Array.prototype.slice.call(arguments,1);

    return fn(newArr);

}

function test(n,m){

console.log(n+m);

}

callIt(test,1,2);

输出: 1,2undefined

//这里传入test的n是数组,m是undefined

---------------------------------------------------------------------------------------------------------------------

function callIt(fn) {

    var newArr = Array.prototype.slice.call(arguments,1);

    return fn.apply(this,newArr);

}

function test(n,m){

console.log(n+m);

}

callIt(test,1,2);

输出:3 

总结:

1、Array.prototype.slice.call(arguments,1);让类数组可以调用数组的slice方法。获取arguments从1开始的参数。

2、fn.apply(this,newArr);这里使用apply主要是为了将装有参数的数组里的参数参入fn中。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,053评论 0 2
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,104评论 1 10
  • call 和 apply EC3给Function的原型定义了两个方法,它们是 Function.prototyp...
    WeekOne阅读 465评论 0 0
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,842评论 2 17
  • 一直以来好像都没有真正了解过自己,思想和身体是分开的。我又是我,我又好像不是我。 那个我是喜欢笑的,喜欢聊天的,爱...
    鹿漫天阅读 217评论 0 0