一、自运行
自运行:一个函数在定义的同时且运行(调用)
自运行一般针对匿名函数
let fun = function(){
console.log("heihei");
}
fun() == function(){}()
function(){
console.log("heihei");
}();
自运行语法3种表达形式
//a.
(function(){
console.log("heihei");
})();
//b.常用
(function(){
console.log("xixi");
}());
//c.
//通过关键字和运算符实现自运行
! function(){
console.log("haha");
}();
void function(){
console.log("yingying");
}();
二、闭包
1.什么是闭包?
闭包:函数嵌套函数,被嵌套的函数就是闭包函数;
2.作用:可以在一个函数的外部,使用该函数的内部局部变量;
function fun1(){
var count = 0; //闭包的前提函数嵌套函数
var fun2 = function(){//被嵌套的函数fun2为闭包函数
return ++count;
}
return fun2;
}
将全局变量f绑定了局部变量fun2,从而延长了fun2的生命周期
var f = fun1();//fun1() == fun2
console.log(f()); // fun2();
console.log(f());
3.实现:创建一个子函数,子函数操作父函数的局部变量,将子函数作为父函数的返回值,在外部定义全局变量绑定父函数的返回值,从而实现全局与局部的绑定,延长了局部变量的生命周期;
4.缺陷:闭包会打破垃圾回收机制,大量使用闭包可能会造成内存泄漏
变形
function fun(){
var count = 0;
return function(){
return ++count;
}
}
var f = fun();
console.log(f());
console.log(f());
函数定义的方式
//定义:函数在定义时也是一个对象
//a.
function fun1(){
console.log("fun1");
}
//b.
let fun2 = function(){
console.log("fun2");
}
//c.
//let fun3 = new Function([参数列表],函数体);
let fun3 = new Function("console.log('heihei')");
fun3();
let add = new Function("a","b","return a+b");
console.log(add(3,4));