柯里化var args = [].slice.call(arguments, 1); 的理解

187 阅读1分钟

首先你要具备如下知识:

  • []是什么?

  • [].slice.call是什么?

  • arguments是什么?

我们逐一来看:

[]是什么?

[]是js语法中创建一个新数组的意思,看如下代码:

var a = [];
var b = new Array();

这两种写法并无二致。

[].slice.call是什么?

首先你知道[]是一个数组,那么[].slice是它的一个方法,是一个函数。
它的作用是返回数组中的某一段,看如下代码:

var a = [1, 2, 3, 4, 5];
var b = a.slice(2);
// ba2号位开始的片段
// 也就是[3, 4, 5]

在js中,函数本身也是一种对象,也是具有属性和方法的,call就是其中之一。
它的第一个参数,是指定函数执行时的this指针,后面的参数,就是函数执行的参数。
具体的不展开讲,你可以查阅MDN: Function.prototype.call()
看如下代码:

var a = function (n) {
    console.log(this, n);
}
var b = {};

a(1); // log出Window对象, 1
a.call(b, 2); // log出b对象, 2

所以说[].slice.call(arguments, 1)实际上相当于(并不一定等同于):

arguments.slice(1);

arguments是什么

arguments可以看做一个数组。每一个js函数内部都有arguments,它代表传入的参数数组。
看如下代码:

function a() {
    console.log(arguments);
}

a(1, 2, 3); // log出[1, 2, 3]

现在你应该明白了,[].slice.call(arguments, 1)返回的是arguments数组从1号位开始的片段。
看如下代码:

function a() {
    var args = [].slice.call(arguments, 1);
    console.log(args);
}

a('haha', 1, 2, 3, 4, 5); // log出[1, 2, 3, 4, 5]

a('run', '-g', '-b'); // log出['-g', '-b']