A JavaScript Fancier

伟大的javascript技术研究中...

  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  304 随笔 :: 0 文章 :: 479 评论 :: 0 Trackbacks

JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别。

先来看看JS手册中对call的解释:

call 方法
调用一个对象的一个方法,以另一个对象替换当前对象。

call([thisObj[,arg1[, arg2[,   [,.argN]]]]])

参数
thisObj
可选项。将被用作当前对象的对象。

arg1, arg2,  , argN
可选项。将被传递方法参数序列。

说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

说明白一点其实就是更改对象的内部指针,即改变对象的this指向的内容。这在面向对象的js编程过程中有时是很有用的。

引用网上一个代码段,运行后自然就明白其道理。

<input type="text" id="myText"   value="input text">
<script>
    
function Obj(){this.value="对象!";}
    
var value="global 变量";
    
function Fun1(){alert(this.value);}

    window.Fun1();   
//global 变量
    Fun1.call(window);  //global 变量
    Fun1.call(document.getElementById('myText'));  //input text
    Fun1.call(new Obj());   //对象!
</script>

call函数和apply方法的第一个参数都是要传入给当前对象的对象,及函数内部的this。后面的参数都是传递给当前对象的参数。
运行如下代码:
<script>
   
var func=new function(){this.a="func"}
    
var myfunc=function(x){
        
var a="myfunc";
        alert(
this.a);
        alert(x);
    }
    myfunc.call(func,
"var");
</script>

可见分别弹出了func和var。到这里就对call的每个参数的意义有所了解了。

对于apply和call两者在作用上是相同的,但两者在参数上有区别的。
对于第一个参数意义都一样,但对第二个参数:
apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。

如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])

同时使用apply的好处是可以直接将当前函数的arguments对象作为apply的第二个参数传入

posted on 2007-11-30 10:37 Yemoo'S JS Blog 阅读(41800) 评论(28)  编辑 收藏 引用 所属分类: javascript技巧总结

评论

# re: 关于JavaScript中apply与call的用法意义及区别[未登录] 2008-07-09 10:24 路过
之前都没接触call和apply,没搞清楚,看了楼主文章才明白。用这个call也可以来用“继承”。
function parent(){
this.a="a";
}
function child(){
parent.call(this);
}
var c = new child();
alert(c.a);  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2008-11-25 23:35 ddd
<script>
var func=new function(){this.a="func"}
var myfunc=function(x){
var a="myfunc";
alert(this.a);
alert(x);
}
myfunc.call(func,"var");
</script>

你怎么不试试能不能运行??????
首先var func=new function(){this.a="func"}里的new function就写错了,应该是new Function
但是改过后依然报错,垃圾  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2008-12-08 16:26 asdf
new Function?????
LS的用的VBs???????
呵呵  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2009-02-09 02:49 路人甲
var func=new function(){this.a="func"}
只是创建一个对象,而不是函数,这里的function(){this.a="func"}是个对象,所以没错  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2009-02-12 10:33 凤飞飞
@ddd
var func=new function(){this.a="func"}
这样写是完全正确的,等同于
function f(){this.a="func"}
var func=new f();
只是用了匿名函数而已  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2009-02-16 11:16 BarryWei
@ddd
恩,凤飞飞说的对,构造了匿名函数的一个对象。  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2009-06-03 14:51 fans
<input type="text" id="myText" value="input text">
<script>
function Obj(){this.value="对象!";}
var value="global 变量";
function Fun1(){alert(this.value);}

window.Fun1(); //global 变量
Fun1.call(window); //global 变量
Fun1.call(document.getElementById('myText')); //input text
Fun1.call(new Obj()); //对象!
</script>


这段有问题吧,第二个应该还是弹出global变量,因为还是call后是用全局来代替this。
麻烦发文章时自己把东西调好,不然会误人子弟的。  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别[未登录] 2009-07-31 10:20 钱途无梁
@路人甲
说得对.
  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2009-10-23 13:06 222
apply、call、prototype 三都结合来一起使用。实现继承很方便。  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2010-05-06 11:48 最帅的猪
不管别人怎么评价,反正,我是学习了,呵!  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别[未登录] 2010-05-07 21:07 kk
你才是SD吧?你运行一下人家的代码
  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2010-07-26 15:54
@ddd
你没看懂
var func=new function(){this.a="func"}
定义了一个匿名类的同时实例化了,用JAVA的角度去看就类似于
new ActionListener(){

}一样  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2010-07-26 15:58
@fans
你搞错了,楼主是对的  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2010-07-31 12:57 jianghp
没有学过C++的人,感觉很难学好javascript  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2011-02-25 16:58 sds
dadad  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2011-04-15 20:39 郑国栋
我觉得lz一点错都木有啊  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2011-12-29 14:31 asd
@郑国栋
var 变量 = function(){ ... ;}  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2012-02-20 15:58 aa
可以不用写new 但写上可能不报错@路人甲
  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2012-03-31 11:28 珊瑚海
看了楼上几位的留言,真的很搞笑,菜鸟菜并不可耻,真正可耻的是身为一个菜鸟还不谦虚学习,自以为是。。楼主没错,楼主威武  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别[未登录] 2013-01-28 02:35 Owen
@路过

回复一楼
你这个不能叫继承,假如你把parent里面的a值重新设一下,比如把值变为“b”,但是child里面的值并不会变为“b”,这并不能叫做继承。

js里面的继承应该是在prototype里面去做才对。  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2013-08-20 12:00 不爱装逼
@凤飞飞
装逼的写法直接
var func={a="func"}  回复  更多评论
  

#  re: 关于JavaScript中apply与call的用法意义及区别 2013-08-20 12:01 不爱装逼
@不爱装逼
var func={a:"func"}  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2014-01-13 09:35 fengshuzi
@fans
那是因为你没有那个input吧所以没找到那个对象,默认又是
全局的了  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2014-03-25 15:38 dddddd
多年后,路过,楼主没错  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2014-04-11 21:28 Zjmainstay
@路过
赞!  回复  更多评论
  

# re: 关于JavaScript中apply与call的用法意义及区别 2014-04-25 18:25 aaaaaaaaaaaaa
那谁讲的是new function()里, function应该大写吧?
new Function(), 这样表达的意思会更明确些.
不过js不限制, 所以也不是错, 只能说不规范而已...  回复  更多评论
  

只有注册用户登录后才能发表评论。