[javascript] 使用函数

在这里插入图片描述

N个指针

函数名就是指向函数的指针

因此一个函数可以有多个函数名

可以通过 函数.name 获取

M个参数

function不关心参数数量,在函数内部可以使用 arguments 类数组对象来获取每一个参数(箭头函数无)

也可以使用拓展运算符 ...args 来获取参数,你拿到的args一定是形如这个格式的:[ 所有参数 ]

js中函数不能重载,所谓重载就是不同函数签名就是两个函数,而 js 中是不同函数名才是两个函数,意味着后定义的函数会覆盖前一个函数

不过可以以检查函数参数数量与类型+分类讨论的方式来模拟函数重载

function的默认参数值设置有以下几种方式:

function(a=1)

// 这种写法会出问题,但很多人这样写,不知道为什么,要避免
function(a) {
	a = a || 1
}

function(a) {
	a = a===undefined ? a : 1}

function(){} 是函数声明,函数声明会提升;a = function(){} 是函数表达式,函数表达式会有临时性死区

3个内部对象

Function实例内部有三个对象:argumentsthisnew.target

先说说 arguments

arguments 是一个类数组对象,因此只能使用一些实现了迭代器协议的功能中使用,而要使用数组原型方法需要形如:

Array.prototype.splice.call(arguments, [1,1])

因为Js函数的特殊性,为避免发生浅拷贝一个递归函数后将原函数回收后将发生的错误,可以使用 arguments.callee 取代函数名进行递归

再说说 this

为了方便说明,我们用 FUNCTION 表述标准函数,用 ARROW 表述箭头函数

FUNCTION内部的this指向调用函数的上下文

ARROW内部的this指向定义函数的上下文

基于此特性,我们衍生了许多应用:

(1)在回调函数中需要使用this时,如果期望this保留当前定义上下文的引用,一种办法是使用 闭包+this遮蔽,一种办法是使用箭头函数

闭包+this遮蔽

function fn() {
	let context = this;
	return function() {
		context.xxx = xxx;
	}
}
let cb = fn();
setTimeout(cb, ms);

使用箭头函数

let cb = () => this.xxx = xxx;
setTimeout(cb, ms);

另外,函数内部的caller调用当前函数的函数

最后讲讲 new.target

js中所有的非箭头函数搭配上 new 都能作为构造函数使用,如何在函数内部检测本函数是否被用作构造函数来使用呢?

if(new.target === this) yes
if(new.target === undefined) no

2个属性

第一个是 length,可以用来获取函数签名中的参数个数,如 fn( a,b ) 有 fn.length === 2

(不过至今不知道有什么用处誒)

第二个是 prototype,是函数的原型对象,上面会保存一些由所有当前构造函数实例所共享的原型属性与原型方法,是 javascript 面向对象的关键角色,举个例子来感受下:

AnimalBird继承,Bird实例化出了一只小duck,每个Animal都有自己的专属名字name,每只Animal都会吃饭eat,每只Bird都有翅膀wing,每只Bird都有自己的专属技能skills

请添加图片描述

3个方法

3个原型方法分别是:applycallbind

apply 与 call 用法与作用相似,就是原地更改函数内部this的指向,并原地立即执行

函数签名分别为 apply( context, 数组 )call( context, .............. )

第二个参数我经常记混淆,我感觉其实不用刻意去记,如果非要刻意记的话,不妨可以这样想:apply是a开头,Array也是a开头,啊,他们好配啊。

bind

1个现象(闭包)

闭包现象是由作用域链+垃圾回收机制引起的

闭包就是内部函数持有了外部函数作用域的部分引用导致外部执行函数已经从调用栈弹出但是内部函数依旧能通过作用域链访问到外部函数中的对应引用,而外部函数所占据的堆栈空间也不会被清除。

(其实我理解的还不是特别透彻,外部的作用域可能可以是其他类型的,不得非要是函数作用域)

闭包些许是把双刃剑,我们可以利用它来完成更加强大的功能,也要尽量避免滥用从而带来内存泄漏。

闭包的应用主要就是 创建一个独立且可访问的命名空间

如创建一个模块,创建私有变量 等等,具体点如防抖节流的写法都用到了闭包的这个应用。

那么如何规避内存泄漏呢?补充下我对闭包学习的笔记吧:
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值