探索JS的函数表达式(你不知道的js)

函数是js中既强大又容易令人困惑的特性,首先定义函数的方法有两种:函数声明和函数表达式


定义函数的两种方法

许多浏览器给函数定义了一个非标准的name属性,console.log(functionName.name) =》 “functionName”,匿名函数的name属性则是一个空的字符串

函数声明的重要特征就是函数声明提升,可以在声明函数之前调用

在函数内部使用函数声明定义函数,只能创建局部函数


递归

递归函数是一个函数通过名字调用自身的情况下构成的


递归

arguments.callee是一个指向正在执行的函数的指针,在这里等同于factorial(num-1)


闭包

闭包就是指有权访问另一个函数内部变量的函数,通常是一个函数包含一个函数的形式,这句话大多数前端er都知道,但如何去理解闭包呢

首先要理解作用域和作用域链的问题,当某个函数被调用时,会创建一个执行环境以及相应的作用域链,然后,使用arguments和其他命名参数来初始化函数的活动对象,在作用域链中,外部函数的活动对象始终处于第二位,外部函数的外部函数的活动对象处于第三位,以此类推,直至全局对象,也就是作用域链的终点:全局执行环境,举个🌰


创建闭包函数

后台的每个执行环境都有一个表示变量的对象——变量对象,全局环境的变量始终存在(window),而像createComparisonFunction()函数这样的局部环境的变量对象,只在函数执行时存在,在创建createComparisonFunction()函数时,会预先创建一个包含全局变量对象的作用域链,被保存在内部的[[Scope]]属性中,这个对象对应的是一个对象的列表,列表中的对象仅能javascript内部访问,没法通过语法访问。

当调用createComparisonFunction()函数时,会为函数创建一个执行环境,然后通过复制函数的[[Scope]]属性中的对象,构建起执行环境的作用域链。作用域链的本质是一个指向变量对象的指针列表,只引用但不实际包含的变量对象。


调用compareNames()函数的过程中产生的作用域链之间的关系

通常函数执行完成,就是销毁局部活动对象,但上面的🌰中的匿名函数的作用域链包含了外部函数的活动对象,所以即使外部函数执行完毕,其局部活动对象也不会销毁,直到匿名函数被销毁。

闭包与变量

由于作用域链的配置机制是一个引用,所以闭包只能获取包含函数中任何变量的最终值。🌰

闭包函数的引用值

由于这里没有参数传递,这里的i是作用域链中引用的对象,即使它的值是基本类型,所以这里输出10个10。

想要获得0-9这样的结果,可以将i作为实参传递给匿名函数的形参,中间是有一个复制的操作,或者使用ES6的let,详情参考这里

this对象

this对象是在运行时基于函数的执行环境进行绑定的,全局环境中指向window,当函数被作为某个对象调用时,指向调用的对象。this始终指向直接调用它的对象。

每个函数在被调用时,会自动取得两个特殊的变量this和arguments,内部函数搜索这两个变量时,只会在活动对象里搜索,并不会向上查找。可以通过变量赋值的方法实现访问。

内存泄漏

众所周知,js在函数执行完毕后会通过垃圾回收机制将函数内部的活动对象销毁,而闭包函数由于作用域链一直引用对象,所以不能销毁,这样就很容易造成内存泄漏问题,所以使用的时候也要记得手动销毁。


模仿块级作用域

js是没有块级作用域的概念的,所以在块语句中定义的变量,实际是包含在函数中的变量,而非语句中的变量。

私有变量

任何函数中定义的变量,都可以认为是私有变量,因为不能从外部访问到。

有权访问私有变量和私有函数的公有方法叫特权方法

利用私有和特权成员,可以隐藏那些不想被直接修改的数据。🌰

在构造函数中定义特权方法

静态私有变量

通过在私有作用域中定义私有变量和函数,创建特权方法。🌰

创建特权方法

这个🌰中的Person构造函数和setName()和getName()方法一样,都有权访问私有变量name,这种模式下,变量name就变成一个静态的,由所有实例共享的属性。

模块模式

模块模式是为单例(只有一个实例)创建私有变量和特权方法。🌰


模块模式创建特权方法

这里的单例就是application,私有对象components数组,返回对象的getComponentCount()和registerComponent()方法都是有权访问components对象的特权方法。

增强的模块模式

在返回对象之前加入对其增强的代码,这种模式适合那些单例必须是某种类型的实例,同时还必须添加某些属性和方法对其增强情况。🌰


增强的模块模式

小结

本文仅是个人的看法,如有错误和补充,欢迎指正和交流。

参考红皮书的一些学习所得

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351

推荐阅读更多精彩内容

  •   函数表达式是 JavaScript 中的一个既强大有容易令人困惑的特性。定义函数的的方式有两种: 函数声明; ...
    霜天晓阅读 814评论 0 1
  • 定义函数的方式有两种:函数声明和函数表达式。 函数声明的一个重要特征就是函数声明提升,意思是在执行代码前会先读取函...
    oWSQo阅读 661评论 0 0
  • 定义函数的方式有两种:一种是函数声明,另一种就是函数表达式。函数声明的语法: 关于函数声明的一个重要特征就是函数声...
    LemonnYan阅读 80评论 0 0
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,113评论 0 21