运动框架的应用实例 结合 异步和回调函数 中的 「回调函数2」
我们可以试图在回调函数中,用this表示oDiv对象,这样感觉爽。
animate(oDiv,{"left":600},2000,function(){
this.style.backgroundColor = "red";
});
但是不行,回调函数中this不是oDiv。所以我们现在要想一个办法,让callback运行,并且callback里面的this是oDiv。
callback.call(elem);
或者:
callback.apply(elem);
执行callback函数,并且让callback函数中的this关键字为elem。
例子:
var obj2 = {
"name" : "树懒",
"age" : 16,
"sex" : "男"
}
function huidiao(){
alert(this.name);
}
//下面这个call语句的含义有两层:
//1 huidiao 函数将被调用
//2 同时这个函数内部的this就是obj了
huidaio.call(obj2);
说白了apply、call功能是一样的,功能都是:让函数调用,并且给函数设置this是谁。
call就是英语呼叫的意思,apply是应用的意思。
现在说说区别:
var obj = {
"name" : "考拉",
"age" : 18,
"jiehun" : false
}
function x(a,b,c){
console.log(this.name);
console.log(a + b + c);
}
x.call(obj,2,3,4);
x.apply(obj,[2,3,4]);
call和apply功能一样,就是让一个函数里面的this设置为一个对象。
拿上例来说,x函数里面的this就是obj对象。但是我们发现,x这个函数,有参数。那么我们现在又想设置this是谁,又想把参数往里传,此时就有区别了:
fn.call(obj,参数1,参数2,参数3……);
fn.apply(obj,[参数1,参数2,参数3……]);
call需要你用逗号罗列所有参数,但是apply是把所有参数写在数组里面。即使只有一个参数,也必须写在数组里面。
比如:
function showInfo(n){
for(var i = 1 ; i <= n ; i++){
console.log(this.name);}
}
showInfo.call(obj,10);
showInfo.apply(obj,[10]);
一定不要记混,apply要的是数组,你想啊,ly、ly、ly长得像list,就是数组。
总结一下,这两个东西功能一致,就是把一个函数里面的this设置为某个对象。区别就是后面的参数的语法。