自运行
一个函数定义时,可以自动运行的函数,针对于匿名函数
原理
let f=function(){ }
f()等价于function(){ }()
语法
- (function(){ }())
- (function(){ })()
- ! function(){ }()
- void function(){ }()
闭包
概念:函数嵌套函数,被嵌套的函数称为闭包函数
作用:在函数外部操作函数内部的局部变量
实现:在子函数中操作局部变量,将子函数作为父函数的返回值,通过一个全局变量绑定父函数的返回值,从而延长了子函数以及局部变量的生命周期,实现了可以在函数外部操作函数内部的局部变量
代码:
function fun() {
var count = 0;
var fun1 = function() {
return ++count;
}
return fun1;
}
let f = fun();
console.log(f())
闭包的缺陷
内存使用完毕后未被垃圾回收机制回收,容易造成内存泄漏
函数对象
函数定义三种方式
- function fun(){}
- let fun=function(){}
- let fun=new Function(“【函数的参数用逗号隔开】”,“函数体”)
函数的内置对象
this:
- 和事件体连用,代表触发该事件的元素
- 和普通方法连用,代表调用该方法的对象
- 和构造方法连用,代表new出来的对象
- 和箭头函数连用,代表调用该方法对象的前缀
arguments:
是一个伪数组,保存着函数的实参
function fun() {
console.log(arguments)
for (let i = 0; i < arguments.length; i++) {
console.log(arguments[i])
}
}
fun(1,"haha",25)
作用:可以写不定参函数(判断参数数据类型,执行不同的操作)
function fun() {
for (let i = 0; i < arguments.length; i++) {
if (typeof arguments[i] == "number") {
console.log("数字操作");
} else if (typeof arguments[i] == "string") {
console.log("字符串操作");
}
}
}
fun("heihei", "hello", 1);
递归
概念:一个函数直接或间接地调用自己本身
let count = 0;
function fun() {
console.log(++count);
fun();
}
fun();
注意:这段代码并不是死循环,栈空间会有内存限制
arguments.callee代表该函数对象
function age(n) {
let c;
if (n == 1) {
c = 10;
} else {
c = arguments.callee(n - 1) + 2;
}
return c;
}
console.log(age(5));
arguments.callee:代表该函数对象
function fun() {
console.log(arguments.callee);
}
fun();