js call和apply方法的了解

来源:互联网 发布:现货白银软件 编辑:程序博客网 时间:2024/05/19 00:55
ECMAScript规范给所有函数都定义了call()与apply()两个方法,call与apply的第一个参数都是需要调用的函数对象,在函数体内这个参数就是this的值,剩余的参数是需要传递给函数的值,call与apply的不同就是call传的值可以是任意的,而apply传的剩余值必须为数组。

call 方法

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

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

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

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

说明

call 方法可以用来代替另一个对象调用一个方法。

call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

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

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

例子:

function fun1() {            this.a = 123;            this.add = function () { return  this.a }}function fun2() {            this.a = 456;}        var f1=new fun1()        var f2=new fun2()        // f1的add函数在f2的作用域里面进行执行 所以a的值是f2的        var a = f1.add.call(f2);  // a输出的是456  function Obj(){this.value="对象!";}    var value="global 变量";    function xxFun(){alert(this.value);}    window.xxFun();   //global 变量    xxFun.call(window);  //global 变量    xxFun.call(document.getElementById('myText'));  //input text    xxFun.call(new Obj());   //对象!


对于apply和call两者在作用上是相同的,但两者在参数上有区别的。

对于第一个参数意义都一样,但对第二个参数:
apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。
如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])

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

同时call和apply可以用作类的继承作用

注:必须在子类里面进行调用父类.call(this)函数
//父类function superObj() {this.member = " dnnsun_Member";this.method = function() {window.alert(this.member);}}//子类function subObj() {//base.call(this); 同样是可以 实现继承 superObj.apply(this);//如果自己有属性 则调用自己的属性this.member = '1234' ;alert(member);                // 调用父类方法this.method();}
0 0
原创粉丝点击