我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家分享.. 如有什么不对的或者说法不明确的地方希望读者多多提一些意见,以便共同提高.. 主要我是要解决一下几个问题: 1. apply和call的区别在哪里 2. 什么情况下用apply,什么情况下用call 3. apply的其他巧妙用法(一般在什么情况下可以使用apply) 我首先从网上查到关于apply和call的定义,然后用示例来解释这两个方法的意思和如何去用. apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性. Function.apply(obj,args)方法能接收两个参数 obj:这个对象将代替Function类里this对象 args:这个是数组,它将作为参数传给Function(args-->arguments) call:和apply的意思一样,只不过是参数列表不一样. Function.call(obj,[param1[,param2[,…[,paramN]]]]) obj:这个对象将代替Function类里this对象 params:这个是一个参数列表 1. apply示例: [javascript] view plaincopy 01.<script type="text/javascript"> 02. /*定义一个人类*/ 03. function Person(name,age) 04. { 05. this.name=name; 06. this.age=age; 07. } 08. /*定义一个学生类*/ 09. functionStudent(name,age,grade) 10. { 11. Person.apply(this,arguments); 12. this.grade=grade; 13. } 14. //创建一个学生类 15. var student=new Student("qian",21,"一年级"); 16. //测试 17. alert("name:"+student.name+"\n"+"age:"+student.age+"\n"+"grade:"+student.grade); 18. //大家可以看到测试结果name:qian age:21 grade:一年级 19. //学生类里面我没有给name和age属性赋值啊,为什么又存在这两个属性的值呢,这个就是apply的神奇之处. 20.</script> 分析: Person.apply(this,arguments); this:在创建对象在这个时候代表的是student arguments:是一个数组,也就是[“qian”,”21”,”一年级”]; 也就是通俗一点讲就是:用student去执行Person这个类里面的内容,在Person这个类里面存在this.name等之类的语句,这样就将属性创建到了student对象里面 2. call示例 在Studen函数里面可以将apply中修改成如下: Person.call(this,name,age); 这样就ok了 3. 什么情况下用apply,什么情况下用call 在给对象参数的情况下,如果参数的形式是数组的时候,比如apply示例里面传递了参数arguments,这个参数是数组类型,并且在调用Person的时候参数的列表是对应一致的(也就是Person和Student的参数列表前两位是一致的) 就可以采用 apply , 如果我的Person的参数列表是这样的(age,name),而Student的参数列表是(name,age,grade),这样就可以用call来实现了,也就是直接指定参数列表对应值的位置(Person.call(this,age,name,grade)); 4. apply的一些其他巧妙用法 细心的人可能已经察觉到,在我调用apply方法的时候,第一个参数是对象(this), 第二个参数是一个数组集合, 在调用Person的时候,他需要的不是一个数组,但是为什么他给我一个数组我仍然可以将数组解析为一个一个的参数,这个就是apply的一个巧妙的用处,可以将一个数组默认的转换为一个参数列表([param1,param2,param3] 转换为 param1,param2,param3) 这个如果让我们用程序来实现将数组的每一个项,来装换为参数的列表,可能都得费一会功夫,借助apply的这点特性,所以就有了以下高效率的方法: a) Math.max 可以实现得到数组中最大的一项 因为Math.max 参数里面不支持Math.max([param1,param2]) 也就是数组 但是它支持Math.max(param1,param2,param3…),所以可以根据刚才apply的那个特点来解决 var max=Math.max.apply(null,array),这样轻易的可以得到一个数组中最大的一项(apply会将一个数组装换为一个参数接一个参数的传递给方法) 这块在调用的时候第一个参数给了一个null,这个是因为没有对象去调用这个方法,我只需要用这个方法帮我运算,得到返回的结果就行,.所以直接传递了一个null过去 b) Math.min 可以实现得到数组中最小的一项 同样和 max是一个思想 var min=Math.min.apply(null,array); c) Array.prototype.push 可以实现两个数组合并 同样push方法没有提供push一个数组,但是它提供了push(param1,param,…paramN) 所以同样也可以通过apply来装换一下这个数组,即: [javascript] view plaincopy 01.vararr1=new Array("1","2","3"); 02. 03.vararr2=new Array("4","5","6"); 04. 05.Array.prototype.push.apply(arr1,arr2); 也可以这样理解,arr1调用了push方法,参数是通过apply将数组装换为参数列表的集合. 通常在什么情况下,可以使用apply类似Math.min等之类的特殊用法: 一般在目标函数只需要n个参数列表,而不接收一个数组的形式([param1[,param2[,…[,paramN]]]]),可以通过apply的方式巧妙地解决这个问题! 5. 总结: 一开始我对apply 非常的不懂,最后多看了几遍,自己多敲了几遍代码,才明白了中间的道理,所以,不管做什么事情,只要自己肯动脑子,肯动手敲代码,这样一个技术就会掌握… 还有比如第四部分得内容,巧妙的解决了实实在在存在的问题,这个肯定不是一个初学者能想到的解决方案(这个也不是我自己想的),没有对编程有一定认识的不会想到这个的,还是一句话,多积累,多学习,提升自己的能力和对编程思想的理解能力才是最关键!
相关推荐
5. **call、apply和bind方法** 这些方法可以显式地设置`this`的值。`call`和`apply`立即调用函数,而`bind`返回一个新函数,新函数的`this`被固定为传入的值。 ```javascript let obj1 = {name: 'John'}; let ...
JavaScript中的apply方法是Function对象的一个非常有用的方法,它允许我们在调用一个函数时,将另一个对象的上下文作为参数传递给该函数。apply方法允许我们指定函数运行时this的值,并将一个数组作为参数传递给函数...
JavaScript中的call、apply和bind方法都是用来改变函数调用时的上下文(即this值)以及传递参数。它们之间的相同点在于,都能够指定函数执行时的this对象,并且都能接收参数。不同点在于它们的调用方式和执行时机。 ...
JS中的call、apply、bind方法详解 随着JavaScript的发展,函数调用对象的改变变得越来越重要。在JavaScript中,call、apply、bind三个方法都是函数对象的方法,它们的作用都是改变函数的调用对象。下面,我们将详细...
5. **`call`和`apply`方法**: 这两个方法都可以改变`this`的指向。它们都允许你在指定的对象上下文中调用函数。`call`接收一个或多个参数,每个参数依次传递;`apply`接收一个包含所有参数的数组或类数组对象。...
本文针对JavaScript中三个重要的函数方法——call、apply和bind,进行详尽的分析,并在文章的结尾部分对这三个方法之间的联系和区别进行了概括,以便于读者更深入地理解它们的用途和应用场景。 首先,我们来探讨...
JavaScript中的this、new、apply和call是理解JavaScript面向对象编程的关键知识点。首先,我们要知道,this关键字在...因此,深入理解this、new、apply和call的原理和使用方法,对于提升JavaScript编程能力至关重要。
`apply`和`call`在某些场景下可以帮助我们解决因`this`指向不明确而引发的问题,比如在事件处理函数、对象方法、构造函数等场合。同时,它们也是实现函数柯里化(Currying)和模拟类继承等高级功能的基础。 安全...
JavaScript 中的 call、apply、bind 方法详解 JavaScript 中的 call、apply、bind 方法是 Function 对象自带的三个方法,这三个方法的主要作用是转变函数中的 this 指向,从而可以达到“接花移木”的效果。下面将对...
### JavaScript中的apply与call用法详解 #### 一、引言 在JavaScript中,`apply`与`call`是两个非常重要的函数,它们都属于`Function.prototype`的一部分,因此每一个函数对象都拥有这两个方法。这两个方法的主要...
在JavaScript中,`call`、`apply`和`bind`都是与函数调用相关的三个重要方法,它们都允许我们改变函数内部`this`的指向,从而实现不同对象间的方法复用和灵活控制上下文环境。下面我们将分别详细介绍这三个方法。 1...
3. **显式绑定**:通过`call`、`apply`或`bind`方法,我们可以显式地设置`this`的值。这些方法允许我们指定一个对象,使得函数在执行时`this`指向该对象。例如: ```javascript function foo() { console.log...
`apply`和`call`方法可以显式地改变函数执行时`this`的指向,它们接受的第一个参数就是希望`this`指向的对象。 `apply`和`call`方法除了可以用来改变`this`的指向,还有一个共同的作用是将数组或类数组对象的元素...
首先,我们需要明白在JavaScript中,函数也是对象,所以它们可以拥有自己的方法,比如toString()、call()和apply()。 在JavaScript中,函数和方法的区别通常取决于函数是如何被调用的。如果函数是作为一个独立的...
在JavaScript中,还有其他一些与继承相关的概念,如`call`和`apply`方法,它们可以改变函数调用时的上下文,从而实现方法的借用。`bind`方法则可以固定函数的`this`值,创建一个新的函数。 另外,`Object.create`...
在JavaScript中实现继承有多种方法,其中构造函数和原型链的方式是较为传统的一种,但在实际应用中存在一些问题和陷阱。本章节将深入分析这些常见的问题,并提出相应的解决方案。 首先,我们回顾一下使用构造函数和...
总的来说,数组降维在JavaScript中可以通过多种方式实现,包括`concat`与扩展运算符、`apply`、递归以及`flat()`方法。选择哪种方式取决于具体需求,如兼容性、效率或代码可读性等。在处理复杂的多维数组时,递归和`...