方法定义:
调用一个对象的一个方法,以另一个对象替换当前对象。
- 共同点
都可以用来代替另一个对象调用一个方法,第一个参数都是用来执行运行环境,this 会被指定为当前调用对象
关于第一个参数,输入类型不同,对应的this也不一样,如下:
function a(){
console.log(this);
}
a.call();//window
a.call(null);//window
a.call(undefined);//window
a.call(1);//Number
a.call('aaa');//String
a.call(true);//Boolean
a.call(a);//function(){}
a.call({'a':'b'});//Object{}
- 不同点
call(),有多个参数
apply()只有两个参数,第二个参数是一个数组
用法
- 一个简单的例子:
获取数组中最大值和最小值,
var num=[3,23,543,2,52,-1000];
var maxNum=Math.max.apply(this,num);
var minNum=Math.min.call(this,num[0],num[1],num[2],num[3],num[4],num[5]);
不确定有几个参数的时候使用
function n(){
console.log.apply(this,arguments)
}
// n(1,3,'a','',{},true);
call()传入 的第一个参数作为 this,传入的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数,看代码进行理解
function eat(x,y) {
console.log(x+y);
}
function drink(x,y) {
console.log(x-y);
}
drink.call(eat,3,2);//1
eat.call(drink,3,2);//5
扩展bind()方法
参数用法类似于call,但call/apply 是立刻调用函数的,bind 是返回一个函数,然后可以在其他时候调用。
this.x = 9;
var module = {
x: 81,
getX: function() { return this.x; }
};
console.log(module.getX()); // 81
var retrieveX = module.getX;
console.log(retrieveX());//9, 因为 this 指向全局对象
var boundGetX = retrieveX.bind(module);
console.log(boundGetX()); // 81
- 比较
var person = {
name: "James Smith",
hello: function(thing) {
console.log(this.name + " says hello " + thing);
}
}
// call
person.hello.call(person, "world"); //James Smith says hello world
// bind
var helloFunc = person.hello.bind(person);
helloFunc("world"); //James Smith says hello world
网友评论