每一个Function对象都有一个apply()方法和一个call()方法
apply
:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。arguments为b的参数.a为对象
call
:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法
bind()
就是将某个函数绑定到某个对象上。
它们的共同之处:
都“可以用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由thisObj指定的新对象”。
不同:第一个参数相同,就是指定的对象
call()在第一个参数之后的 后续所有参数就是传入该函数的值
apply()只有2个参数,第二个参数为数组,必须保证参数的有有效性,不能少.
参数不确定时候,利用apply,acll 完成,定义一个方法,让他可以代理某一个方法.
function log(){
console.log.apply(console, arguments);
};
log(1); //1
log(1,2); //1 2
//利用arguments 通过 Array.prototype.slice.call 转化为标准数组,再使用数组方法unshift,
function log(){
var args = Array.prototype.slice.call(arguments);
args.unshift('(app)');
console.log.apply(console, args);
};
bind()
的另一个最简单的用法是使一个函数拥有预设的初始参数。
function list() {
return Array.prototype.slice.call(arguments);
}
var list1 = list(1, 2, 3); // [1, 2, 3]
// 预定义参数37
var leadingThirtysevenList = list.bind(undefined, 37);
var list2 = leadingThirtysevenList(); // [37]
var list3 = leadingThirtysevenList(1, 2, 3); // [37, 1, 2, 3]
bind()
也可以为需要特定this值的函数创造捷径。
将一个类数组对象转换为真正的数组
var unboundSlice = Array.prototype.slice;
var slice = Function.prototype.call.bind(unboundSlice);
// ...
slice(arguments);
在Javascript中,多次 bind()
是无效的。
bind() 方法的,他后面多了对括号。
console.log(foo.getX.bind(obj)()); //81
console.log(foo.getX.call(obj)); //81
console.log(foo.getX.apply(obj)); //81
也就是说,区别是,当你希望改变上下文环境之后并非立即执行,而是回调执行的时候,使用 bind() 方法。而 apply/call 则会立即执行函数。
箭头函数
语法比函数表达式更简洁,并且没有自己的this,arguments,super或 new.target。
- 使用剩余参数是相较使用arguments对象的更好选择。
function foo(arg) {
var f = (...args) => args[0];
return f(arg);
}
foo(1); // 1
function foo(arg1,arg2) {
var f = (...args) => args[1];
return f(arg1,arg2);
}
foo(1,2); //2
- 箭头函数不能用作构造器,和 new一起用会抛出错误。
- 由于 箭头函数没有自己的this指针,通过 call() 或 apply() 方法调用一个函数时,只能传递参数(不能绑定this)
- 箭头函数没有prototype属性。