函数调用有以下几种方法:
-
函数名(实参列表);
-
函数名.call(执行环境对象,实参列表);
-
函数名.apply(执行环境对象,实参列表数组);
-
函数名.bind(执行环境对象)(实参列表);
方法一:
var obj = {
name: 'zhangsan',
sayName: function () {
console.log(this.name);
}
}
var b = obj.sayName;
b(); //undefined 这个时候,this指向的是b,b不存在name这个对象
obj.sayName(); // zhangsan
后三种方法作用类似,都是改变this的指向
call:简单的说,A.call(B) 就是使得A可以身上可以使用B的属性,使得A披上了B的假面
var obj = {
name: 'zhangsan',
sayName: function () {
console.log(this.name);
console.log(a,b); // 1,2
}
}
var b = obj.sayName;
b.call(obj,1,2); //zhangsan
apply 和call区别是后面多传递的参数要使用数组来包含
var obj = {
name: '张三',
sayName: function (a,b) {
console.log(this.name);
console.log(a,b); // 100,200
}
}
var b = obj.sayName;
b.apply(obj,[100,200]); // 张三
bind 是需要一个参数来接受返回值
var obj = {
name: 'zhangsan',
sayName: function (a,b,c) {
console.log(this.name);
console.log(a,b,c); // 1,2,3
}
}
var b = obj.sayName;
b.bind(obj); // 代码没有被打印,这就是bind和call、apply方法的不同,实际上bind方法返回的是一个修改过后的函数。
// 新建一个变量c来接收bind修改后的函数
var c = b.bind(obj, 1, 2);
console.log(c); // 发现c是一个[Function: bound sayName]函数
// 执行c
c(); //zhangsan
总结:call和apply都是改变上下文中的this并立即执行这个函数,bind方法可以让对应的函数想什么时候调就什么时候调用,并且可以将参数在执行的时候添加,这是它们的区别,根据自己的实际情况来选择使用。