函数 进阶

函数

JavaScript函数是参数化的。
函数的定义会包括一个称为形参(parameter)的标识符列表,这些参数在函数体中像局部变量一样工作。
函数调用会为形参提供实参的值。
函数使用实参的值来计算返回值,成为该函数调用表达式的值。
除实参外,每次调用还会拥有另一个值(本次调用的上下文),这就是this关键字的值。

函数即对象

函数定义方式

函数声明语法:
在这里插入图片描述
函数表达式:
在这里插入图片描述
函数声明和函数表达式的区别:函数声明语法在函数声明前就可以调用,而函数表达式只能在其声明后才能调用;函数声明中函数名是必须的,而表达式不是。

箭头函数:
箭头函数不支持argumrnts对象,支持剩余参数
在这里插入图片描述

arguments对象

传进函数的每个参数值都被包含在arguments 对象(类数组)中。

一个类数组对象(但不是 Array 的实例),因此可以使用中括号语法访问其中的元素。
要确定接收到的参数个数,可以访问 arguments.length 属性。

es6支持包含参数默认值。简化es5的写法

使用剩余参数来扩展参数值;
剩余参数必须位于参数列表的末尾
在这里插入图片描述
reduce对数组元素进行处理相加,返回他们的和

函数调用

构成函数主体的JavaScript代码在定义之时并不会执行,只有调用该函数时,它们才会执行。
有4种方式来调用JavaScript函数:
作为函数
作为方法
作为构造函数
通过它们的call()和apply()方法间接调用

调用上下文

属性访问表达式有两部分,一个对象和一个属性名,该对象则成为调用上下文this
例如 obj.hello(),obj则为调用上下文this
且this没有作用域限制

函数的间接调用
call和apply

第一个参数指定调用上下文(函数内部的this)它是调用上下文,在函数体内通过this来获得对它的引用,第二个参数给函数传递参数。
在这里插入图片描述

回调函数

被作为实参传入另一函数,并在该外部函数内被调用,用以来完成某些任务的函数,称为回调函数。
在这里插入图片描述

函数属性

1.prototype属性
每一个函数都包含一个prototype属性,这个属性是指向一个对象的引用,这个对象称做“原型对象”(prototype object)。
每一个函数都包含不同的原型对象。当将函数用做构造函数的时候,新创建的对象会从原型对象上继承属性。

2.自定义属性
函数是一种特殊的对象,可以拥有属性。
在这里插入图片描述

函数方法

bind( )方法
将函数绑定至某个对象。
当在函数f()上调用bind()方法并传入一个对象o作为参数,这个方法将返回一个新的函数。
(以函数调用的方式)调用新的函数将会把原始的函数f()当做o的方法来调用。

偏函数
固定一个函数的一个或者多个参数,返回一个新的函数,这个函数用于接受剩余的参数。
在这里插入图片描述
实现一个自定义偏函数生成器:
在这里插入图片描述

偏函数的好处:

  1. 通过创建一个名称易懂的独立函数,调用是无需每次传入第一个参数,因为第一个参数通过bind提供了固定值。
  2. 当我们有一个很通用的函数,为了方便提供一个较常用的变体。

闭包

函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中称为“闭包(closure)”。从技术的角度讲,所有的JavaScript函数都是闭包:它们都是对象,它们都关联到作用域链。

实例:
在这里插入图片描述
闭包的缺点
闭包的缺点就是常驻内存会增大内存使用量,并且使用不当很容易造成内存泄露。
如果不是因为某些特殊任务而需要闭包,在没有必要的情况下,在其它函数中创建函数是不明智的,因为闭包对脚本性能具有负面影响,包括处理速度和内存消耗。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值