Js中apply()和call()方法

来源:互联网 发布:关于网络管理的书 编辑:程序博客网 时间:2024/05/16 01:09

在学习JS函数时,apply和call这里不是很明白,查了几个帖子总结了一下,做了如下笔记。


以下主要介绍这三个问题:

1.apply和call方法的作用是什么?

2.apply和call有什么区别?

3.apply和call分别在什么情况下使用?


0.apply和call方法的定义

apply():方法能劫持另外一个对象的方法,继承另外一个对象的属性.

Function.apply(obj,args)方法能接收两个参数  
obj:这个对象将代替Function类里this对象  
args:这个是数组,它将作为参数传给Function


call():和apply的意思一样,只不过是参数列表不一样.  

看一个apply的例子:

<script>    function Person(name,age){        this.name = name;        this.age = age;    }    function Student(name,age,grade){    Person.apply(this,arguments);    this.grade = grade;    }    var student = new Student("zll",12,"Grade6");    alert(student.name+","+student.age+","+student.grade);//结果为zll,12,Grade6</script>
结果为:zll,12,Grade6

Student类里面我没有给name和age属性赋值啊,为什么又存在这两个属性的值呢,这个就是apply的神奇之处


分析:

Person.apply(this,arguments);  

this:在创建对象时代表的是student  
arguments:是一个数组,也就是[“zll”,”12”,”Grade6”];


通俗一点讲就是:

用student去执行Person这个类里面的内容,在Person这个类里面存在this.name等语句,这样就将属性创建到了student对象里面 。

当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作。


1.apply和call方法的作用

call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。

关于“改变函数体内部 this 的指向”,来看以下代码:

<script>    function add(a, b){    console.dir(this);    }    function sub(a, b){    console.dir(this);    }        add(1,2);//"Window"    sub(1,2);//"Window"    add.apply(sub, [1, 2]);//"sub(a, b)"    sub.apply(add, [1, 2]);//"add(a, b)"</script>


2.apply和call有什么区别?

二者的作用完全一样,只是接受参数的方式不太一样。

apply()方法接受两个参数,一个是在其中运行函数的作用域,另一个是参数数组。参数数组可以是Array的实例或是arguments对象。

对于call()方法而言,第一个参数this值没有变化,传递给函数的参数必须逐个列举出来。

看下面代码:

 function sum(num1,num2){        return num1 + num2;    }    function callSum1(num1,num2){    return sum.apply(this,arguments);//参数为arguments对象    }    function callSum2(num1,num2){        return sum.apply(this,[num1,num2]);//参数[num1,num2]为Array的实例    }    function callSum3(num1,num2){        return sum.call(this,num1,num2);//参数num1,num2逐个列举出来    }

3.apply和call分别在什么情况下使用?

使用apply()还是call(),完全取决于给函数传递参数的方式。参数是明确知道数量时,用 call(),而不确定的时候,用 apply()。


本文参考:Js高级程序设计

                 博客:http://blog.csdn.net/business122/article/details/8000676

                  知乎赵望野和杨佰的回答:https://www.zhihu.com/question/20289071

0 0
原创粉丝点击