闭包
function A(){ function B(){ console.log("hello world"); } return B; } var c = A(); c();//hello world
这就是一个最简单的闭包
翻译为自然语言如下
- 定义普通函数A
- 在A中定义普通函数B
- 在A中返回B
- 执行A,并把A执行结果赋值给变量C
- 执行C
当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包。
立即执行函数
此类函数没有声明,再一次执行过后即释放。适合做初始化工作
//立即执行函数 也会有预编译的过程 var num = (function(a,b,c){ var d= a+b+c*2-2; return d; }(1,2,3))
立即执行函数的两种写法
- (function(){}()); W3C 建议第一种
- (function(){})();
关键点补充:
- 只有表达式才能被执行符号执行
//此为函数声明,不可以被执行符号执行
function test(){ var a = 123; }();
- 能被执行符号执行会忽略函数的名称
//&& || + - ! 会让函数声明变成表达式,加上执行符号 即立即执行函数,然后忽略函数名称 !function test(){ }()
所以立即执行函数可写成
(function(){}());
例题
function test(a,b,c,d){ console.log(a+b+c+d); }(1,2,3,4);
正常不能执行,系统识别成了
function test(a,b,c,d){ console.log(a+b+c+d); } (1,2,3,4);
这样就不会报错,但并不是立即执行函数