资讯专栏INFORMATION COLUMN

犀牛书——CHAP8:函数

he_xd / 666人阅读

摘要:若有函数名,则在函数体内指代该函数本身,并且只存在于函数体中。返回值与普通函数相同。如果嵌套函数作为普通函数调用,则指向全局对象或者构造函数调用在函数或者方法调用之前使用关键字,则为构造函数调用。创建一个新的对象继承构造函数的属性。

1. 函数定义
- 函数表达式:函数名称可有可无。若有函数名,则在函数体内指代该函数本身,并且只存在于函数体中。函数名称 === arguments.callee
- 函数声明:存在函数提升。变量只提升变量并不提升赋值,函数提升整个函数体都会提升,因此可在声明前调用函数。不能存在于循环。条件判断、try/cache、with等语句中。在ES6中可以。
- 构造函数:使用`new Function()`若传入一个参数则这个参数为函数体,传入多个参数则前面的都是函数实参,最后一个参数为函数体。在函数创建时解析,效率比前两种慢。运行的时候只能访问自己的本地变量和全局变量,不能访问Function构造器被调用生成的上下文的作用域。在全局作用域中创建执行。
2. 函数调用 2.1 函数调用
- 参数:计算参数表达式的值作为函数的实参传递给声明时的形参;
- 返回值:(1)在执行到return语句时返回,返回值为return之后的值。(2)若return后无值或者函数没有return语句(执行到函数末尾)则返回undefined.
- 调用上下文(this):非严格模式下是全局对象(window),严格模式下是undefined.
2.2 方法调用
如果函数表达式是作为**对象的属性调用**,则为方法调用。
- 参数:与普通函数相同。
- 返回值:与普通函数相同。
- 调用上下文(this):调用该方法的对象就是调用上下文。实质是给函数传入隐式的实参——调用该方法的对象。
- 方法链:如果方法的返回值是一个对象,则返回的对象还可以再调用它的方法形成方法链。**当方法不需要返回值时,最好之间返回this形成方法链。**
- `this`是关键字,没有作用域的限制。如果嵌套函数作为方法调用,则this指向调用它的对象。如果嵌套函数作为普通函数调用,则this指向全局对象或者undefined.
2.3 构造函数调用
在函数或者方法调用之前使用关键字new,则为构造函数调用。创建一个新的对象,继承构造函数的prototype属性。
- 参数:与普通函数相同。作为初始化对象的参数。
- 返回值:如果return语句返回一个对象,则这个对象为返回值。如果return没有返回值或者返回原始值,则这个新创建的对象作为返回值。
- 调用上下文(this):新创建的对象。
2.4 间接调用
使用`call()`,`apply()`方法显示制定调用所需的this值,使任何函数可以作为任何对象的方法调用。
3. 函数的实参和形参
- 形参:函数中定义的变量
- 实参:运行时的函数调用传入的参数
当实参个数 < 形参个数时,剩下的形参的值为undefined.因此,可给形参设置默认值,当传入的值为undefined时,形参就使用默认值。
- 实参对象:`arguments`指向实参对象的引用,是一个类数组对象,可通过数字下标访问传入的实参值,**该对象只在函数内部有效**。arguments[]应用场景是函数需要固定个数的命名必须参数和不定数的可选实参。`arguments`有两个属性:length和callee.length属性表示传入函数的实参的个数,callee指向当前执行的函数。
- 当参数过多时,可以使用对象的属性作为参数。解决参数顺序的问题。
4. 闭包
- 闭包:函数**对象**可以**通过作用域链相互关联起来**,函数体内部的变量都可以保存在函数作用域内。
- 函数的作用域链是在**函数定义**的时候创建的,并且在函数执行时依然有效。作用域链是一个对象列表或者链表,这组对象定义了这段代码“作用域"中的变量。对于不存在嵌套函数的函数体内,作用域上有两个对象:一是定义函数参数和局部变量的对象,二是全局对象。当函数返回时,从作用域链中将这个绑定变量的对象删除,如果没有其他引用指向这个绑定对象,则这个对象会被当做垃圾回收掉。但是在存在嵌套函数中,嵌套函数有自己的作用域链,并且这个作用域链指向一个变量绑定对象。因此,当外部函数将嵌套函数作为返回或者存储在某处的属性里时,就有外部引用指向嵌套函数,嵌套函数指向外部函数的变量对象,因此这个变量对象就不会被回收,还能访问。主要用于私有变量和私有方法。
5. 函数的属性和方法 5.1 函数的属性
- length属性:表示函数的形参的个数。即函数希望传入多少个参数。
- prototype:当将函数用作构造函数的时候,新创建的对象会从原型对象上继承属性。
5.2 函数的方法
- `call()`,`apply()`:使任何函数可以作为任何对象的方法调用。第一个参数传入调用上下文。对于`call()`来说第二个参数传入函数调用需要的实参。对于`apply()`来说第二个参数传入一个数组或者类数组对象,该数组包含函数调用的实参。
- `bind()`:创建一个新的函数。第一个参数传入新函数的调用上下文,后面的参数是函数调用的参数依次使用。
6. 函数式编程
- 高阶函数:接受一个或多个函数作为参数,并返回一个新函数。
- 不完全函数:可参照`bind`的应用。
- 记忆函数:使用私有变量作为缓存。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79835.html

相关文章

  • 犀牛——CHAP10:正则表达式

    摘要:设计目的是为了让在全局范围内有效。在正则表达式后部引用前面的子表达式。传入分隔符或正则表达式。对象属性以下属性返回布尔值。是否包含修饰符以下不返回布尔值整个字符串下一次搜索开始的位置。返回布尔值,若匹配则返回。 1. 正则表达式语法 1.1 表示方法 - `//`字面量模式,`/表达式/修饰符` - 使用`new RegExp(字符串,修饰符 | 正则表达式)`构造函数。 在ES5中,...

    JessYanCoding 评论0 收藏0
  • 犀牛——CHAP7:数组

    摘要:数组有以下特点无类型数组元素可以是任意元素。因此,当小于数组最大索引时,大于的数组元素会被删除。原数组不会改变将数组元素转换为字符串并连接在一起。默认将数组元素用,连接,传入的参数即为连接符。 showImg(https://box.worktile.com/view/fcfcdf2c99b14edfb6768085955ae253?pid=4b0845b09ca94218a955f8...

    Alfred 评论0 收藏0
  • 如何循序渐进地学习Javascript

    摘要:如果在初学一门语言的时候第一想到的是问别人,是很难取得进步的。如果你真想学好,我有个大概的自学轨迹供你们参考。第一步,学习的编程。立即可以尝试的实例,也可以让的初学者马上看到效果。读懂别人的代码是学习,而改进别人的代码则是创造了。 javascript入门太容易了,导致几乎人人随便看看就能上手,零基础的人学个三五天都能对外宣称自己掌握了js。可是真正掌握js是一件很难的事情。如果在初学...

    DTeam 评论0 收藏0
  • 犀牛——CHAP6:对象

    摘要:对象是属性的无序集合。使用对象直接量创建的对象的原型就是,使用运算符创建的对象的原型是构造函数的的值。主要目的是将对象锁定,避免外界干扰。判断对象是否封闭。删除属性可删除对象的自有属性且为的属性。 对象是属性的无序集合。因此,这一章主要从对象和属性两个方面来阐述。showImg(https://box.worktile.com/view/c8f5f376fe314aeca69d9b4c...

    philadelphia 评论0 收藏0
  • 如果想成为一名顶尖的前端,这份单你一定要收藏!

    摘要:其中负载均衡那一节,基本上是参考的权威指南负载均衡的内容。开发指南读了一半,就是看这本书理解了的事件循环。哈哈创京东一本骗钱的书。 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯IVWEB团队 发表于云+社区专栏作者:link 2014年一月以来,自己接触web前端开发已经两年多了,记录一下自己前端学习路上看过的,以及道听途说的一些书,基本上按照由浅入深来介绍...

    callmewhy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<