javascript 之Function对象的apply(),call(),bind(),方法和arguments,caller,length属性
注:这篇文章原文:http://www.jb51.net/article/30883.htm
自己作为学习,重新写写。
一、写在前面的话
前端javascript编程还只是略懂皮毛,DOM知道一点,jquey会用一点点,深知夯实基础,了解前端的系统的知识对于web开发(自己主要做的是PHP后台的开发)的重要。固然,要用什么,就查什么(现学现卖)很合理,但对于长远来讲,只是在隔靴捎痒,很难有实际的作为。
故,痛定思痛,应该对web前端,尤其是 javascript开发(过程式-->面向对象-->各种javascript库、jquery,即javascript框架、Anjular)这些东西都应该有一些全面系统、慢慢深入的了解。只有全面系统了解了,深入进去了,才不会老是临时才报佛脚,才能自己主动去发现问题,自己主动去提高,开拓眼界。
二、javascript 的Function对象
官方API 文档(IE microsoft):https://msdn.microsoft.com/zh-cn/library/x844tc74(v=vs.94).aspx
由于Function对象的属性和方法,我们自定义的函数都会自动有这些属性和方法,具体用的时候查看API,IE、FireFox、Chrome可能不同。
主要讲讲apply(),call():
1、apply(),call()用途相同,都是在特定的作用域中调用函数。++call和apply方法通常被用来实现类似继承一样的功能,以达到代码复用的功效。它们的区别主要体现在参数上。
2、接受参数方面,apply()接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。
call()方法第一个参数与apply()方法相同,但传递给函数的参数必须列举出来。
例1:
1 2 3 4 5 6 7 8 | window.firstName = "diz" ; window.lastName = "song" ; var myObject = { firstName: "my" , lastName: "Object" }; function HelloName() { console.log( "Hello " + this .firstName + " " + this .lastName, " glad to meet you!" ); } HelloName.call(window); //huo .call(this); HelloName.call(myObject); |
运行结果为:
Hello diz song glad to meet you!
Hello my Object glad to meet
you!
例2:带参数
1 2 3 4 5 | function sum(num1, num2) { return num1 + num2; } console.log(sum.call(window, 10, 10)); //20 console.log(sum.apply(window,[10,20])); //30 |
分析:通过例1发现,apply()和call()的真正用武之地是能够扩充函数赖以生存的作用域,如果我们想要用传统的方法实现,代码如下:
1 2 3 4 5 6 7 8 9 | window.firstName = "diz" ; window.lastName = "song" ; var myObject = { firstName: "my" , lastName: "Object" }; function HelloName() { console.log( "Hello " + this .firstName + " " + this .lastName, " glad to meet you!" ); } HelloName(); //Hello diz song glad to meet you! myObject.HelloName = HelloName; myObject.HelloName(); //Hello my Object glad to meet you! |
我们发现,要想让HelloName()函数的作用域在对象myObject上,我们需要动态的创建 myObject的 HelloName属性,此属性作为 指针 指向 HelloName()函数,这样,我们调用 myObject.HelloName()时,函数内部的this变量就指向 myObject,也就可以调用该对象内部的其他公共属性了。
分析例2,我们可以看到call()和apply()函数的真正运用之处,在实际项目中,还需要根据实际灵活加以处理!
一个小问题:再看一看函数中定义函数时,this变量的情况 :
1 2 3 4 5 6 7 8 9 | function temp1() { console.log( this ); //Object {} function temp2() { console.log( this ); //Window } temp2(); } var Obj = {}; temp1.call(Obj); //运行结果见上面绿色的注释!!!! |
执行结果与下面的相同
1 2 3 4 5 6 7 8 9 | function temp1() { console.log( this ); temp2(); } function temp2() { console.log( this ); } var Obj = {}; temp1.call(Obj); |
例3:
再看一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | //定义一个Animal类<br>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(); //通过call或apply方法,将原本属于Animal对象的showName()方法交给当前对象cat来使用了。 //输入结果为"Cat" animal.showName.call(cat, "," ); //animal.showName.apply(cat,[]); |
3、bind()方法
支持此方法的浏览器有IE9+、Firefox4+、Safari5.1+、Opera12+、Chrome。它是属于ECMAScript5的方法。直接看例子:
1 2 3 4 5 6 7 | window.color = "red" ; var o = { color: "blue" }; function sayColor(){ alert( this .color); } var OSayColor = sayColor.bind(o); OSayColor(); //blue |
这里,sayColor()调用bind()方法,并传入o对象,返回了OSayColor()函数,在OSayColor()中,this的值就为o对象。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!