犀牛书——CHAP8:函数

发布时间:2019-08-19 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了犀牛书——CHAP8:函数脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

犀牛书——CHAP8:函数

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值,使任何函数可以作为任何对象的方法调用。
@H_17_126@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`的应用。
- 记忆函数:使用私有变量作为缓存。

脚本宝典总结

以上是脚本宝典为你收集整理的犀牛书——CHAP8:函数全部内容,希望文章能够帮你解决犀牛书——CHAP8:函数所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。