原文:Javascript之旅——第九站:吐槽function

  

说到funciton,也是我对js非常吐槽的一点,封装的让我眼瞎,马蛋的,哥只能大眼睁着去黑盒的使用,简直只有完完全全的听各类图书对

function的道听图说,完全没有做到一点点的眼见为实。

一:function是什么

  在很久很久以前,我们只知道function是一个函数,用C#的话来说就是一个方法,既然是方法嘛,肯定就是挂在类下面的,但是其实呢?

在js中函数就是对象,并不是我们惯性思维中的方法。何以为证呢?看代码。

从图中可以看到我声明了一个say函数,但是我很奇怪的看到,为什么say函数会有一些属性和方法呢?比如本该属于Object的toString,valueOf,

constructor等等?然后比较好奇的去看看constructor到底是什么,可以看到其实是个Function构造函数,那这样我就非常清楚了,然来say只不过

是Function对象的一个实例引用,知道了这个我就可以很轻松的把代码恢复如下:

二:看看function中一些属性和方法

  现在我们知道了function其实就是一个对象,我们知道所有的引用类型都是继承自object,那为了好做比较,我定义了一个object的实例,

接下来看看function中到底都有那些专属属性和方法。

可以看到,子类function确实还是有点自己的东西,那接下来就简单探讨下常用的属性和方法。

1. arguments属性

  说到这个属性就特么的来气,就眼瞎,眼瞎的地方在于这个arguments属性里面其实做了很多很多的东西,以至于下面的一些奇怪现象

可能会让你目瞪口呆!!!

<1>奇怪现象一:我的function中都没有形参,居然还能接受到实参的值。。。

<2>奇怪现象2:形参和实参传递并不统一,可以多传递,可以少传递,js都不会报错。

<3>奇怪现象3:形参和arguments居然可以做到同步,太神奇了。

上面的三个现象是不是让你觉得很奇怪???这些奇怪的现象是不是让你觉得Function中封装的太狠,因为他们做了很多操作,而你却只能大眼

瞪小眼,啥也看不到。。。是不是非常遗憾呢???由于看不到源代码我也无能为力,只能根据书中的讲解以及自己的理解来领悟了。“高程3”中

是这么说的,当调用function中传递的实参其实是给了Function构造函数中的一个”内部数组“,而arguments其实是对”内部数组“的高层封装,

封装后的arguments不再是数组了,而是一个伪装的数组,之所以这么说是因为arguments还需要一个自己的独有属性callee,而这个callee

保存的就是当前的对象say,所以只能把arguments做成对象,我可以让你眼见为实。

然后最诡异的一个问题就是形参能够和arguments实现数据同步,既然能够做到同步,我的第一个反应就是使用同一块内存地址,但是仔细想想

他们怎么可能做到共享内存地址呢?但是再想想的话,arguments是对”内部数组“的封装,我就想这个name应该也是被做过手脚的,也就是说

name其实也是对”内部数组“的封装,就像ECMA5中对字段提供get/set访问器一样,当然这是我的一种猜测,解释代码如下:

从上图中我们看到,当我对name进行赋值的时候,其实改变的是args这个数组的值,同理当我改变arguments的值时,其实也是修改”内部数组“

的值,通过类似这种方法来达到我们上层看到的同步机制,画个简图如下:

2. length属性

  如果你知道了上面的原理,那这个也好猜测,要么取得是正真的“内部数组”的length,要么就是取伪类arguments的length,反正最终都是

”内部数组”的length,对不对,比较常用但是又没什么好说的。

3.prototype属性

这个也是Function内部做出来的一个属性,很有意思,我想大家也有耳闻,也不是三言两语能说得清楚的,准备放在下篇详细的讲讲。

4.caller属性

看这个名字大概也知道个一二,就是用来获取当前的父函数,不要小看这个caller哦,你有没有想过它可以实现C#中的stacktrace的功能

呢?有时候我们记js日志就靠这玩意了,比如下面这样。

5:call,apply方法

 因为这两个函数的功能都一样,只不过call方法必须逐一参数赋值,而apply必须传递数组,如果想眼见为实,可以看看它们在vs里面的代码

提示,一切都明白了,所以我就放在一块说了,不过这鸟东西有什么好处呢?它最大的好处就是可以随便绑定对象,然后就可以实现对绑定对象

动态新增方法和属性,可能说的有点抽象,看个例子就OK啦。

我们发现,本来我的obj只是一个空对象,通过apply之后,我的obj对象具有name和age属性了,是不是很神奇呢?

Javascript之旅——第九站:吐槽function相关推荐

  1. Javascript之旅——第二站:对象和数组

    一觉睡到中午,本来准备起来洗洗继续睡,不过想想没辙,还得继续这个系列,走过变量的第一站,第二站我们再来看看对象和数组. 一:对象   说起对象,我们不自然就想起了面向对象中自封装的一个类,同样JS中也 ...

  2. Javascript之旅——第一站:从变量说起

    原文出处: 一线码农的博客   欢迎分享原创到伯乐头条 工作这几年,js学的不是很好,正好周末有些闲时间,索性买本<js权威指南>,大名鼎鼎的犀牛书,好好的把js深入的看一看.买过这本书的 ...

  3. Sql Server之旅——第九站 看看DML操作对索引的影响

    我们都知道建索引是需要谨慎的,当只有利大于弊的时候才适合建,同时也知道建索引是需要维护成本的,这个维护也就在于DML操作,下面具体看看到底DML对索引都有哪些内幕.... 一:delete操作 现在大 ...

  4. Javascript之旅——第十站:为什么都说闭包难理解呢?

    原文:Javascript之旅--第十站:为什么都说闭包难理解呢? 研究过js的朋友大多会说,理解了js的原型和闭包就可以了,然后又说这些都是js的高级内容,然后就又扯到了各种神马的作用域...然后不 ...

  5. Javascript之旅——第四站:parseInt中要注意的坑

    Javascript之旅--第四站:parseInt中要注意的坑 原文:Javascript之旅--第四站:parseInt中要注意的坑 前些天信用卡站点要接入一个新功能,不过还真比较坑爹,asp站点 ...

  6. C#发现之旅第九讲 ASP.NET验证码技术

    C#发现之旅第九讲 ASP.NET验证码技术 袁永福 2008-5-15 系列课程说明     为了让大家更深入的了解和使用C#,我们将开始这一系列的主题为"C#发现之旅"的技术讲 ...

  7. 敏捷之旅杭州站演讲PPT(敏捷开发在淘女郎)

    附件是2011.11.26在杭州举行的敏捷之旅杭州站会议时我的演讲的PPT http://files.cnblogs.com/lynnwong/scrumintstar.pdf 转载于:https:/ ...

  8. Python学习笔记:第九站 一串连一串

    Python学习笔记 文章目录 Python学习笔记 第九站 一串连一串 1. 字符串的驻留机制 2. 字符串的常用操作 3. 字符串的比较 4. 字符串的切片操作 5. 格式化字符串 6. 字符串的 ...

  9. 2012敏捷之旅苏州站活动将于2012年11月3日在西交利物浦大学举办

    大会名称: 2012敏捷之旅苏州站 主办方:  敏捷苏州社区 大会主题:  "Bootstrapping Your Agile Journey" 开启你的敏捷旅程. 大会目标: 搭 ...

  10. JavaScript学习笔记-B站动力节点

    文章目录 1.1.什么是JavaScript,有什么用? 1.2.HTML,CSS,JavaSript三者关系 2.在HTML中怎么嵌入JavaScript代码? 3.JS的标识符和关键字 4.关于J ...

最新文章

  1. python-logging用法
  2. php word转pdf linux,Linux平台中使用PHP把word转pdf的实现方法
  3. SQLServer事务的隔离级别
  4. QtJava笔记-Qt与Java进行SSL双向认证(Qt客户端,Java服务端)
  5. hadoop--HDFS的Shell相关操作
  6. 【无人机】物流行业迈入“无人”时代!全自动智能无人机投入运营,成本直降80%!...
  7. CentOS配置ssh无密码登录的注意点
  8. Ubuntu环境下远程调试Android手机设备
  9. 计算机软考网络工程师中级多少分过,2019年计算机软考网络工程师中级及格分数...
  10. 生物信息学:根据PDB名称、爬虫PDB数据库的信息、保存到Excel里
  11. win10下如何快速安装迷你迅雷
  12. Urbansound8k声音分类深度学习实战
  13. 论文选题的原则、来源与方法
  14. 51单片机入门(3)点灯的进阶——跑马灯(通过阻塞延时实现)
  15. CC建模重建项目总是失败的原因
  16. vue 表情包编码转换
  17. 计算机博士英文复试自我介绍,考博英语复试自我介绍7篇自我介绍
  18. 中企海外周报 | 海尔俄罗斯洗衣机互联工厂开业;奥克斯建造泰国智能生产基地...
  19. 2021年6大好用又免费BI软件系统
  20. 漫画:如何盗刷别人的支付宝?

热门文章

  1. 【tf.keras.Model】构建模型小结(部分问题未解决)
  2. ArcGIS修改矢量边界(土地利用图图斑)
  3. 使用讯飞实现语音听写与语音合成功能
  4. 阿里云:已有10000家企业在云上构建数据湖
  5. Flink on YARN(上):一张图轻松掌握基础架构与启动流程
  6. 记住没:永远不要在 MySQL 中使用 UTF-8
  7. 几种主流热修复方案分析
  8. 勤能补拙 VS 思考补拙
  9. android怎么操作才会出现anr_博客笔记大汇总,Android优化总结篇
  10. python编程学习笔记_python学习笔记--python编程基础