欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

js call和apply方法的了解

程序员文章站 2024-02-28 19:59:28
...
ECMAScript规范给所有函数都定义了call()与apply()两个方法,[color=red][b]call与apply的第一个参数都是需要调用的函数对象,在函数体内这个参数就是this的值[/b][/color],剩余的参数是需要传递给函数的值,call与apply的不同就是call传的值可以是任意的,而apply传的剩余值必须为数组。

[size=large][color=red][b]call 方法[/b][/color][/size]

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

[color=red]call([thisObj[,arg1[, arg2[, [,.argN]]]]])[/color]

[b]参数[/b]
thisObj
可选项。[b][color=red]将被用作当前对象的对象。[/color][/b]

arg1, arg2, , argN
可选项。[color=red][b]将被传递方法参数序列。[/b][/color]

说明

[b][color=red]call 方法可以用来代替另一个对象调用一个方法。[/color][/b]

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

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

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

[b]例子:[/b]



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()); //对象!


[color=red]对于apply和call两者在作用上是相同的,但两者在参数上有区别的。[/color]

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

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

[color=red][size=large][b]同时call和apply可以用作类的继承作用[/b][/size][/color]

[size=medium][color=blue][b]注:必须在子类里面进行调用父类.call(this)函数[/b][/color][/size]

//父类
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();
}