1)bind与apply、call 的最大区别就是:bind不会立即调用,其他两个会立即调用
var fn = {
_int: function(){return 3},
fun: function(){
$(id).click(function() {
console.log(this._int())
}).bind(this);
}
}
2)apply和call的区别
语法: function.apply(thisObj, [obj1,obj2,obj3,...]);
function.call(thisObj, obj1,obj2,obj3,...);
定义:调用对象的一个方法用另一个对象替换当前对象
共同点:都能改变函数的对象上下文
不同点:
apply:最多只能有两个参数——新this对象和一个数组argArray。如果给该方法传递多个参数,则把参数都写进这个数组里面,当然,即使只有一个参数,也要写进数组里。如果argArray不是一个有效的数组或arguments对象,那么将导致一个TypeError。如果没有提供argArray和thisObj任何一个参数,那么Global对象将被用作thisObj,并且无法被传递任何参数。
call:它可以接受多个参数,第一个参数与apply一样,后面则是一串参数列表。这个方法主要用在js对象各方法相互调用的时候,使当前this实例指针保持一致,或者在特殊情况下需要改变this指针。如果没有提供thisObj参数,那么 Global 对象被用作thisObj
用法:
1》基本用法:
function add(a,b) {return a+b;};
function sub(a,b) {return a-b;};
var a1 = add.apply(sub, [4,2]);
var a2 = sub.apply(add, [4,2]);
//var a1 = add.call(sub,4,2);
//var a2 = sub.call(add,4,2);
console.log(a1) 6
console.log(a2) 2
2>实现继承
function Animal(name){
this.name = name;
this.showName = function(){
alert(this.name);
}
}
function Cat(name){
Animal.apply(this,[name]);
}
var cat = new Cat("咕咕");
cat.showName();
/*call的用法*/
Animal.call(this,name);
3》多重继承
function Class10(){
this.showSub = function(a,b){
alert(a - b);
}
}
function Class11(){
this.showAdd = function(a,b){
alert(a + b);
}
}
function Class12(){
Class10.apply(this);
Class11.apply(this);
// Class10.call(this);
//Class11.call(this);
}
var c2 = new Class12();
c2.showSub(3,1); //2
c2.showAdd(3,1); //4
4>apply的一些其他巧妙用法
a: 求数组中的最大项
var arr = [1,3,5,7,9,3,4,55,33];
var max = Math.max.apply(null, arr);
console.log(max);
b: 求数组中的最小项
var min = Math.min.apply(null, arr);
console.log(min);
c: 合并两个数组并返回新数组的长度
var arr1 = new Array("1","3","5","7","9");
var arr2 = new Array("2","4","6","8");
console.console(Array.prototype.push.apply(arr1, arr2));
小结:三个的使用区别
都是用来改变函数的this对象的指向的;
第一个参数都是this要指向的对象;
都可以利用后续参数传参;
bind是返回对应函数,便于稍后调用,apply、call是立即调用;