您的位置:首页 > 移动开发

JS函数与call()apply()详解

2014-11-05 11:25 537 查看
JavaScript中的每个函数都是一个对象。

  因为函数都是对象,它们有自己的属性和方法。我们可以把它们看作数据(data)。

函数和方法的区别?
  函数立足于它们自己(例如:alert()),
  而方法是函数内部一个对象的属性(dictionary),我们通过对象来调用方法。
  每个JavaScript函数都会有很多附属的(attached)方法,包括toString()、call()以及apply()。

定义了一个全局函数f()。f()通过this关键字访问变量x,

var x = 10;
function f(){
alert(this.x);
}
f();
function p(){
var x=100;
alert(x);
}
p();


注意:我们不能通过一个对象的实例来调用这个函数。

  this指向的是什么对象呢?this会指向这个全局对象。我们的变量x就是在这个全局对象中定义的。

  上面的代码能够正常运行,运行结果会显示一个对话框,对话框中显示10。 第二个函数 输出100,函数内部属性

js里call函数改变对象指针,指向另一个对象调用

var x = 10;
var o = { x : 15};
function f(){
alert(this.x);
}
f();
f.call(o);


  首先调用f()将会显示10的对话框,因为this这个时候指向的是全局对象。

  然后我们调用f函数的call()方法,传入的参数是o,运行结果显示的是o中x属性的值15。

  call()方法会用它的第一个参数作为f函数的this指针。也就是说,我们会告诉运行时,f函数中的this指向的是哪个对象。

call传入参数

<script type="text/javascript">
var x = 10;
var o = { x : 15};
function f(y){
alert(this.x); this指O对象
alert(y);
}

f.call(o,this.x); this指全局对象属性10
</script>


<script language="javascript"><!--

/**定义一个animal类*/
function Animal(){
this.name = "Animal";
this.showName = function(){
alert(this.name);
}
}
/**定义一个Cat类*/
function Cat(){
this.name = "Cat";
}

/**创建两个类对象*/
var animal = new Animal();
var cat = new Cat();

animal.showName.call(cat,",");

//通过call或apply方法,将原本属于Animal对象的showName()方法交给当前对象cat来使用了。
//输入结果为"Cat"

</script>


call函数实现对象继承

<script language="javascript"><!--
function Class1()
{
this.showTxt = function(txt)
{
alert(txt);
}
}

function Class2()
{

Class1.call(this);
}

var c2 = new Class2();

c2.showTxt("cc");
</script>


c2对象可以具有了 Class对象的所有方法

apply()函数

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

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

  对应的apply写法为:func.apply(func1,[var1,var2,var3])
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: