call,apply,bind这三个方法其实都是继承自Function.prototype中的,属于实例方法,只能绑定函数表达式,不能用于函数声明
call() apply() 作用:指定绑定函数内部this的指向(即函数执行时所在的作用域),然后在所指定的作用域中,调用该函数。并且会立即执行该函数
bind()方法创建一个新的函数,在调用时设置this关键字为提供的值。并在调用新函数时,将给定参数列表作为原函数的参数序列的前若干项
1.一号
function cat(){}
cat.prototype.food = 'fish';
cat.prototype.say = function(){
console.log('i love eat:' + this.food); // i love eat fish}
var bluecat = new cat();
bluecat.say();
var yellowdog = { food:'bone' }
bluecat.say.call(yellowdog); // i love eat bone //括号里为指定函数执行时的上下文环境
2.二号
function sum(a,b){
return a + b;
}
console.log(sum.length); //返回函数形参长度
console.log(sum.call(undefined,3,4));
call与applyd的第一个参数可以传null,undefined,this,当所绑定的函数在window环境下
(3)得到数组中的最大值
因为Math.max( )是无法传入一个数组的,因此需要用call与es6的扩展运算符转换一下
Math.max( ...[4,3,2,8]) //8
Math.max.apply(null, [9,8,4,2,6]) //9
(4)bind()
(5)使用bind后会返回一个新的匿名函数,在事件的绑定与解绑时需要注意
bind 方法与 call / apply 最大的不同就是前者返回一个绑定上下文的函数,而后两者是直接执行了函数。