apply
用途:在特定的作用域中调用函数,实际上等于设置函数体内this对象的值
第一个参数:在其中运行函数的作用域
第二个参数:参数数组
(详细用法可以参考另外一篇文章:深入理解apply)
call
和apply()方法类似,唯一区别是:
apply()把参数打包成Array再传入,call()把参数按顺序传入
如:
Math.max.apply(null, [3, 5, 4]); //5
Math.max.call(null, 3, 5, 4); //5
bind
将函数绑定到指定环境
一个简单的bind()函数接受一个函数和一个环境,并返回一个在给定环境中调用给定环境的函数,并且将所有参数原封不动传递过去。
语法:
function bind(fn, context0 {
return function() {
return fn.apply(context, arguments);
};
}
在bind()中创建了一个闭包,闭包使用apply()调用传入的函数,并给apply()传递context对象和参数。arguments对象是内部函数的,并非bind()的,当调用返回的函数时,它会在给定环境中执行被传入的函数病给出所有参数。(高程)
可以从以下例子中区别call,apply,bind
情景:
已知函数fn执行需要3个参数,请实现函数parcial。调用之后满足:
1)返回一个函数result,该函数接受一个参数
2)执行result(str3),返回的结果是与fn(str1,str2,str3)一致。
- call和apply必须显式地调用str3,立即执行
- bind不是立即执行,未传入str3时,并未执行,只是返回一个函数,等待参数传入
- this用于上下文不确定的情况
call:
function parcial(fn, str1,str2) {
function result(str30) {
return fn.call(this,str1,str2,str3);
}
return result;
}
apply:
function parcial(fn, str1, str2) {
function result(str3) {
return fn.apply(this,[str1, str2, str3]);
}
return result;
}
bind:
function parcial(fn, str1, str2) {
return fn.bind(this, str1, str2);
}
这个bind会生成一个新函数(对象),它的str1,str2参数是定死的,str3未传入,一旦传入就会执行
function partial(fn, str1, str2) {
function result(str3) {
return fn.bind(this,str1,str2)(str3);
}
return result;
}
把str3传入的过程写在另一个函数里面,而另外一个函数也有str1,str2参数,跟上面一种写法有多此一举的感觉,但是可以体现出后续的调用,以及和apply,call的比较。
bind不加后面的括号返回的是函数,加上后面的括号返回的是函数值,这也是bind和call和apply的主要区别。
bind需要二次调用,而call和apply返回的是函数值,直接调用。
整理自:牛客网