js中的call(), apply()和bind()是Function.prototype下的方法,都是用于改变函数运行时上下文,最终的返回值是你调用的方法的返回值,若该方法没有返回值,则返回undefined。这几个方法很好地体现了js函数式语言特性,在js中几乎每一次编写函数式语言风格的代码,都离不开call和apply,能够熟练运用它们,是真正成为一名jser程序员的重要一步。 1.相同点 call()、apply()、bind方法的相同点就是这两个方法的作用是一样的。都是在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域,可借助它们实现继承;。 例子:
function People(name, age) {
this.name = name;
this.age = age;
}
function Student(name, age, grade) {
People.call(this, name, age);
this.grade = grade;
}
const student = new Student('myfirebug', 14, '高三');
console.log(`我叫${student.name},今年${student.age}岁了,读${student.grade}了`); // 我叫myfirebug,今年14岁了,读高三了
在这个例子里,People.call(this, name, age);中的this代表的是Student,这也就是之前说的,使得Student可以调用People中的方法,因为People中有this.name = name;等语句,这样就将name和age属性创建到了Student中。 call()可以让括号里的对象来继承括号外函数的属性。 至于apply()方法作用也和call()方法一样,可以这么写:
People.apply(this, [name, age]);
People.apply(this, arguments);
2.不同点 a)、call()和apply()唯一区别是参数不一样 1)、apply()方法接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。 2)、call()方法不一定接受两个参数,第一个参数也是函数运行的作用域(this),但是传递给函数的参数必须列举出来。 b)、bind()是返回一个新函数,供以后调用,而apply()和call()是立即调用。