我是昨天看的这部分知识,怎么说呢,别人的博客都是在自己精通的情况下用尽量让所有人都懂的语言来写博客,而我,致力于用最土的语言,以我自己的理解来学习,来编写,方便以后巩固和学习,不免那里理解的不到位,都是以后要修改的伏笔!是啊!昨天情人节,被狗粮养的我今天激情澎湃!
步入正题,说道call,我想起的第一个事情就是学this的时候,哪里经常出现这个词,不过介于我连this都不是很牢靠,所以这里只说对于call的理解。
和call一样,apply基本也是那个时候见到的!用法差不多,就是参数上有些不同罢了,比如call的参数可以直接写出来,但是apply却要以数组的形式!尊素不本质呢!也不怕上天有神淋!不努力就吸啊!嘻嘻···
好了,接下来就不得不来一个例子了!不然只说的话,我也怕以后自己会用小拳拳锤自己胸口啊!哼!也不给自己机会!皮皮虾,我们走!!!
function people(){}
people.prototype = {
name : "Dianzhang",
love : function(){
console.log(this.name+"best lover is Luoyihang" );
}
}
var dianzhang = new peolple;
dianzhang.love(); //Dianzhang best lover is Luoyihang;
但是呢,人生并没有那么圆满啊,不是任何事都是可以走钢索的啊! 店长爱罗一航我们都知道,但是店长有很多啊,但是宫政就只有一个啊!所以····现有 Gongzheng = {name : "Gongzheng"};那么厉害了,我想让宫政最爱的人是罗一航,怎么办?挺急的。在线等! 等毛线啊!call in不得了! 再次我们给他“请”过来啊!
dianzhang.love.call(Gongzheng);
dianzhang.love.apply(Gongzheng);
没错啊!这两个的结局都是Gongzheng bset lover is Luoyihang!
好了好了,知道他俩是一对了!下一题!!!
等一下!慌个皮皮虾啊!还没讲细节呢! 就是啊!总结一下,所有call,apply就是为了动态改变this,把一个对象没有的方法通过call,apply去替换,你看上面那个吧! Gongzheng本身并没有love方法,但是people有啊!而dianzhang又new了people一下,所以dianzhang有啊! 这么一来,我们用dianzhang去call Gongzheng,等于用Gongzheng里面的name去替换dianzhang的name,apply同理喽!
至于他俩的区别,刚才不是说了,参数问题嘛!另外的话,如果确定参数个数,可以用call,不确定的话,最好用apply,当然啦!还是数组格式~~
var func = function(arg1,arg2){}
func.call(this,arg1,arg2);
func.apply(this,[arg1,arg2]);
接下来我们介绍一下他俩一些常见的用法
首当其冲,我们知道apply用来push数组再合适不过了
var
array1 = [12 ,
"foo"
, {name
"Joe"
} , -2458];
var
array2 = [
"Doe"
, 555 , 100];
Array.prototype.push.apply(array1, array2);
/* array1 值为 [12 , "foo" , {name "Joe"} , -2458 , "Doe" , 555 , 100] */
var
numbers = [5, 458 , 120 , -215 ];
var
maxInNumbers = Math.max.apply(Math, numbers),
//458
maxInNumbers = Math.max.call(Math,5, 458 , 120 , -215);
//458
functionisArray(obj){
return
Object.prototype.toString.call(obj) ===
'[object Array]'
;
var
foo = {
bar : 1,
eventBind:
function
(){
var
_this =
this
;
$(
'.someClass'
).on(
'click'
,
function
(event) {
/* Act on the event */
console.log(_this.bar);
//1
});
}
}
var
foo = {
bar : 1,
eventBind:
function
(){
$(
'.someClass'
).on(
'click'
,
function
(event) {
/* Act on the event */
console.log(
this
.bar);
//1
}.bind(
this
));
}
}
var
bar =
function
(){
console.log(
this
.x);
}
var
foo = {
x:3
}
bar();
// undefined
var
func = bar.bind(foo);
func();
// 3
var
obj = {
x: 81,
};
var
foo = {
getX:
function
() {
return
this
.x;
}
}
console.log(foo.getX.bind(obj)());
//81
console.log(foo.getX.call(obj));
//81
console.log(foo.getX.apply(obj));
//81