所有函数实例都具有 Function 中的实例成员:
- length属性:得到函数形参数量。
- apply方法:调用函数,同时指定函数中的 this 指向,参数以数组的形式来传递。
- call方法:调用函数,同时指定函数中的 this 指向,参数以参数列表的形式来传递。
- bind方法:返回一个新函数,该函数中的 this 始终指向指定的值。
- test.html
var test = function (a, b) {}
test.length; // => 2
test.length 表示函数形参的个数。
- test.html
function sayHello(a, b) {
console.log(this.name, this.age);
}
var user1 = {
name: "foo",
age: 18
};
/* 要求打印 user1 中的 name 和 age */
// 错误做法:
sayHello(); // 因为 this ==> window 所以不行
user1.sayHello(); // 因为 user1 里面没有 sayHello 这个函数 所以不行。
// 正确做法:
sayHello.apply(user1); // "foo" 18
sayHello.call(user1); // "foo" 18
var newFun = sayHello.bind(user1);
newFun(); // "foo" 18
user1.sayHello = sayHello;
user1.sayHello(); // "foo" 18
apply、call、bind 它们都能改变函数中 this 的指向,但是,也存在一些区别。其中 apply、call 会在绑定 this 的同时,将函数给调用一遍,而 bind 仅仅是返回一个新的,并且绑定好 this 的函数,并没有把函数个调用一遍。
- test.html
function sayHello(a, b) {
console.log(this.name, this.age, a, b);
}
var user1 = {
name: "foo",
age: 18
};
sayHello.apply(user1, [1, 2]); // => "foo" 18 1 2
sayHello.call(user1, 1, 2); // => "foo" 18 1 2
var newFunc = sayHello.bind(user1, 1, 2);
newFunc(); // => "foo" 18 1 2
- apply:参数以数组的形式传递;
- call:参数以参数列表的形式传递;
- bind:参数以参数列表的形式传递;
注意:bind 不仅可以绑定 this 的指向,还可以绑定形参。
arguments:在函数中使用,获取该函数调用时,传递的所有参数。arguments 是一个类数组(也称为伪数组,没有通过 Array 构造函数创建的类似于数组结构的对象称为类数组),伪数组会缺少大量的数组实例方法。arguments 数组中的值,会与对应的形参映射。
- test.html
var test = function abc(a, b) {
arguments[0] = "abc";
b = 123;
a; // => "abc"
b; // => 123
arguments; // => ["abc", 123]
}
test(1, 2);
var test = function abc(a, b) {
arguments[0] = "abc";
b = 123;
a; // => undefined
b; // => 123
arguments; // => ["abc"]
}
test(); // 没有传递参数,所以 arguments 不会与形参映射
var test = function abc(a, b) {
arguments[0] = "abc";
b = 123;
a; // => "abc"
b; // => 123
arguments; // => ["abc", 123]
}
test(undefined, 2);
从上面的例子可以看出,arguments 是否会与形参之间形成映射关系,还得看我们在调用函数的时候,是否有传入参数。若我们传入了参数,那对应位置的形参就会与 arguments 形成映射关系,否则不会有映射。
- test.html
function test() {
arguments; // => [1, 2, 3, 4, 5]
Array.isArray(arguments); // => false
//将 arguments 转换为真数组
var newArr = [].slice.call(arguments);
Array.isArray(newArr); // => true
newArr; // => [1, 2, 3, 4, 5]
}
test(1, 2, 3, 4, 5);
通常,可以利用 apply、call 方法,将某个伪数组转换伪真数组。
Array.isArray()
用于判断数组是真数组还是伪数组。
将一个伪数组转换为一个真数组的方式还有很多,后面会接触到,比如 es6 提供的展开运算符,就可以很轻易的实现,至于其他方式,这里就不作过多介绍了。
function test() {
arguments; // => [1, 2, 3, 4, 5]
Array.isArray(arguments); // => false
const newArr = [...arguments];
newArr; // => [1, 2, 3, 4, 5]
Array.isArray(newArr); // => true
}
test(1, 2, 3, 4, 5);