博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
理解函数:对象(this,arguments),方法(apply(),call(),bind())。
阅读量:6952 次
发布时间:2019-06-27

本文共 1558 字,大约阅读时间需要 5 分钟。

hot3.png

1.this和arguments

在函数内部,有两个特殊的对象:arguments和this。

arguments:包含着传入函数中的所有参数。arguments有一个callee属性,该属性是一个指针,指向拥有这个arguments对象的函数。

this:引用的是函数据以执行的环境对象(作用域)。

caller属性:保存着调用当前函数的函数(父函数)的引用。

arguments.callee等同于使用其的函数名。在递归算法中,使用arguments.callee代替函数名,可以消除函数耦合带来的隐患。

耦合:简单地说,软件工程中对象之间的耦合度就是对象之间的依赖性。对象之间耦合越高,维护成本越高。因此对象的设计应使类与构件之间的耦合最小。(百度百科:耦合)

实例:

window.color = "red";var o = {color:"blue"};function sayColor(){    alert(this.color);}sayColor();    //"red"o.sayColor = sayColor;o.sayColor();    //"blue"

在调用函数之前,this的值并不确定,this可能会在代码执行过程中引用不同的对象。当在全局作用域中调用sayColor()时,this引用的是全局对象window;当把这个函数赋给对象o并调用o.sayColor()时,this引用的是对象o。

function outer(){    inner();}function inner(){    alert(inner.caller);    //inner可以用arguments.callee代替}outer();    //显示outer()函数源代码

outer()调用了inner(),所以inner.caller就指向outer()。

2.apply(),call(),bind()

每个函数都包含两个非继承而来的方法:apply()call(),两者用途都是在特定的作用域中调用函数,他们能够改变函数赖以运行的作用域。bind()是ECMAScript中定义的方法。这个方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。

实例:

window.color = "red";var o = {color:"blue"};function sayColor(){    alert(this.color);}sayColor();    //redsayColor.call(this);    //redsayColor.call(window);    //redsayColor.call(to);    //blue

直接改变作用域的最大好处,就是对象不需要与方法有任何的耦合关系。在前面的例子中,我们先是将sayColor()函数放到对象o中,然后在通过o来调用它的,而在这里重写的例子中,就不需要先前那个多余的步骤了。

window.color = "red";var o = {color:"blue"};function sayColor(){    alert(this.color);}var objectSaycolor = sayColor.bind(o);objectSayColor();    //blue

sayColor调用bind()并传入对象o,创建了objectSayColor()函数。objectSayColor()函数的this值等于o,因此即使在全局作用域中调用这个函数,也会看到“blue”。

转载于:https://my.oschina.net/hiYoHoo/blog/399218

你可能感兴趣的文章
DHCP
查看>>
Mysql 删除表(Drop)后数据恢复成功
查看>>
我的友情链接
查看>>
python while循环和双层循环
查看>>
史上最全程序员资源分享
查看>>
[置顶] Jquery插件之信息弹出框showInfoDialog(成功、错误、警告、通知)...
查看>>
回顾2017,展望2018
查看>>
[转]DPM2012系列之四:配置邮件报警功能
查看>>
LINUX下搭建mail服务器
查看>>
手把手教你把你的网站改为https
查看>>
Rxjs入门
查看>>
静态路由管理距离问题
查看>>
汽车常识全面介绍 - 引擎概论
查看>>
Android源码个个击破之Activity的渲染过程深入剖析
查看>>
C# 免费发邮件
查看>>
final关键字
查看>>
《Java程序员面试宝典》学习笔记(数据结构部分)
查看>>
[转载] 中华典故故事(孙刚)——29 拍马屁
查看>>
[转载] Discrete Mathematics——06 集合代数
查看>>
018,idea 下 如何集成 generator
查看>>