这三个方法都是预定义的JavaScript方法,通过指定对象方法的上下文(this),从而使别的对象也能使用自己定义的对象方法:
let person = { getOccup: function() { console.log(this.occupation); } }; let student = {occupation:"student"} let teacher = {occupation:"teacher"}; person.getOccup.call(student); //student person.getOccup.apply(student); //student person.getOccup.bind(student)(); //student person.getOccup.call(teacher); //teacher person.getOccup.apply(teacher); //teacher person.getOccup.bind(teacher)(); //teacher
其中 bind 方法返回一个函数,必须调用它才能执行代码。
它们之间的差别体现在传参上。
call()、apply() 、 bind() 这三个函数的第一个参数都是 this 的指向对象,其余参数是对象方法所需的参数,差别体现在此处:
call() 分别接收参数,参数间逗号隔开,
apply() 通过数组的形式接收参数,
bind() 和 call() 一样,分别接收参数。
let person = { intro: function(name, age) { console.log(name + " is " + age + " years old and a " + this.occupation); } }; let teacher = {occupation:"teacher"}; person.intro.call(teacher, "Jack", 50); //Jack is 50 years old and a teacher person.intro.apply(teacher, ["Jack", 50]); //Jack is 50 years old and a teacher person.intro.bind(teacher, "Jack", 50)(); //Jack is 50 years old and a teacher person.intro.call(teacher, ["Jack", 50]); //Jack,50 is undefined years old and a teacher /* person.intro.apply(teacher, "Jack", 50); 报错:Uncaught TypeError: CreateListFromArrayLike called on non-object */
JavaScript 数组没有 max() 方法,但我们可以应用 Math.max() 方法来模拟。
// Math.max() 方法找到(数字列表中的)最大数字: Max.math(1, 2, 3); //返回 3 //在数组上模拟 max 方法 let arr = [2, 1, 3]; Max.math.apply(null, arr); //返回 3