JS 中的 apply


今天和同事讨论问题的时候,遇到了一个非常有意思的问题,这里专门讨论一下


请看以下代码

function Set(){
    this.values = {};
    this.n = 0;
    this.add.apply(this, arguments);
}

摘录自 《javascript权威指南》


请对比一下这两个语句

this.add.apply(this, arguments);
this.add(arguments);

或许有人已经看出端倪了,如果说 apply是用来改变上下文环境,那么这里add方法的上下文环境不就是this么?为什么还要使用 apply又改变作用域在 this上面呢?我们在很多JS教程上面看到的都是说 apply的作用是改变指针作用域,改变上下文环境,可其实还有一个作用应该强调一下 解构赋值
在ES6尚不能形成市场影响力的时候,解构赋值其实是一个比较难处理的问题,很多次面对 arguments时却无法把他拆解成一个个参数传入一个函数,只能在函数内接受数组作为参数,然后再进行参数的处理。忽然有一个灵光的脑袋发现了 apply的妙用,apply接受的第二个参数是一个数组,在传给函数的时候是拆解成一个一个元素传递过去的。这不正是我们需要的吗?于是就出现了上述代码,其实这样的代码还在各类JS库中出现,譬如这个:

$.get = function(/* url, data, success, dataType */){
    return $.ajax(parseArguments.apply(null, arguments))
  }

摘录自 zepto.js源码
(未完待续)......

你可能感兴趣的:(JS 中的 apply)