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
实例内部有三个对象:arguments
、this
、new.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 面向对象的关键角色,举个例子来感受下:
Animal
被 Bird
继承,Bird实例化出了一只小duck
,每个Animal都有自己的专属名字name
,每只Animal都会吃饭eat
,每只Bird都有翅膀wing
,每只Bird都有自己的专属技能skills
:
3个方法
3个原型方法分别是:apply
、call
、bind
apply 与 call 用法与作用相似,就是原地更改函数内部this的指向,并原地立即执行
函数签名分别为 apply( context, 数组 )
、 call( context, .............. )
第二个参数我经常记混淆,我感觉其实不用刻意去记,如果非要刻意记的话,不妨可以这样想:apply是a开头,Array也是a开头,啊,他们好配啊。
bind
1个现象(闭包)
闭包现象是由作用域链+垃圾回收机制引起的
闭包就是内部函数持有了外部函数作用域的部分引用导致外部执行函数已经从调用栈弹出但是内部函数依旧能通过作用域链访问到外部函数中的对应引用,而外部函数所占据的堆栈空间也不会被清除。
(其实我理解的还不是特别透彻,外部的作用域可能可以是其他类型的,不得非要是函数作用域)
闭包些许是把双刃剑,我们可以利用它来完成更加强大的功能,也要尽量避免滥用从而带来内存泄漏。
闭包的应用主要就是 创建一个独立且可访问的命名空间
如创建一个模块,创建私有变量 等等,具体点如防抖节流的写法都用到了闭包的这个应用。
那么如何规避内存泄漏呢?补充下我对闭包学习的笔记吧: