浅谈JavaScript的apply和call语句

我们试图在回调函数中,用this表示oDiv对象,这样感觉爽。

1    animate(oDiv,{"left":600},2000,function(){

2        this.style.backgroundColor = "red";

3    });

但是不行,回调函数中this不是oDiv。

所以我们现在要想一个办法,让callback运行,并且callback里面的this是oDiv。

1    callback.call(elem);

或者:

1    callback.apply(elem);

执行callback函数,并且让callback函数中的this关键字为elem。

例子:

1            var obj2 = {

2                 "name" : "树懒",

3                 "age" : 16,

4                 "sex" : "男"

5            }

6

7            function xianshixinxi(){

8                 alert(this.name);

9            }

10

11           //下面这个call语句的含义有两层:

12           //1. xianshixinxi函数将被调用

13           //2. 同时这个函数内部的this就是obj了

14           xianshixinxi.call(obj2);

说白了apply、call功能是一样的,功能都是:让函数调用,并且给函数设置this是谁。

call就是英语呼叫的意思,apply是应用的意思。

现在说说区别:

1   
        var
obj = {

2   
             "name"
: "考拉",

3   
             "age"
: 18,

4   
             "jiehun"
: false

5   
        }

6

7

8   
        function
xianshixinxi(a,b,c){

9   
             console.log(this.name);

10  
             console.log(a
+ b + c);

11  
        }

12

13  
        xianshixinxi.call(obj,2,3,4);

14  
        xianshixinxi.apply(obj,[2,3,4]);

call和apply功能一样,就是让一个函数里面的this设置为一个对象。

拿上例来说,xianshixinxi函数里面的this就是obj对象。但是我们发现,xianshixinxi这个函数,有参数。那么我们现在又想设置this是谁,又想把参数往里传,此时就有区别了:

1   
fn.call(obj,参数1,参数2,参数3……);

1   
fn.apply(obj,[参数1,参数2,参数3……]);

call需要你用逗号罗列所有参数,但是apply是把所有参数写在数组里面。即使只有一个参数,也必须写在数组里面。

比如:

1   
        function
showInfo(n){

2   
             for(var
i = 1 ; i <= n ; i++){

3   
                 console.log(this.name);

4   
             }

5   
        }

6   
        showInfo.call(obj,10);

7   
        showInfo.apply(obj,[10]);

一定不要记混,apply要的是数组,你想啊,ly、ly、ly长得像list,就是数组。

总结一下,这两个东西功能一致,就是把一个函数里面的this设置为某个对象。区别就是后面的参数的语法。

上一篇:HDU 2571 命运 (入门dp)


下一篇:Nginx配置特定二级域名