一.匿名函数
1.定义
没有名字的函数。
function(num1,num2){
return num1 + num2
}
2.IIFE
定义:自调用函数,生出来就被调用。
var a = (function(num1,num2){
return num1 + num2})(1,5)
console.log(a)
二.闭包
1.定义
官方定义:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。(函数就是一个表达式)
通俗来说:JavaScript中所有的function都是一个闭包。不过一般闭包是指嵌套的function。
2.形成条件
- 函数的嵌套;
- 内部函数可以访问外部函数的局部变量。
3.解决的问题
全局位置访问不到局部变量。
4.作用
-
可以读取函数内部的变量(局部变量);
-
让外部函数的局部变量的值始终保存在内存中;
-
增加块级作用域。
5.注意事项
-
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包。否则造成网页的性能问题。
-
闭包会在父函数外部,改变函数内部变量的值。所以如果你把父函数当作对象(object)使用,把闭包当做它的公用方法(public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不能随便改变父函数内部变量的值
1.循环里包含匿名函数(没有自我运行——调用)
for (var i = 1; i < 5; i++) { (function(i) { //x表示形参 setTimeout(function() { console.log(i++); }, 200) }) } console.log(i);
2.循环里包含匿名函数(自我运行——调用)
for (var i = 1; i < 5; i++) { (function(x) { //x表示形参 setTimeout(function() { console.log(x++); }, 200) })(i) //i表示实参 } console.log(i);
3.用循环的方式给html元素的事件赋值时,没法把循环变量作为函数的参数进行处理。
如果用循环的方式给HTML元素的事件赋值时,没法把循环变量作为函数的参数进行处理——此时借助this/let。
<body> <ul> <li>我是第1个</li> <li>我是第2个</li> <li>我是第3个</li> <li>我是第4个</li> <li>我是第5个</li> </ul> <script> var liLIst = document.querySelectorAll("li"); for (var i = 0; i < liLIst.length; i++) { liLIst[i].onclick = function() { console.log(i); } } </script> </body>
无论点击谁都是在控制台输出5。为了达到预期的目标,点击那个li,输出那个的下标。此时将var关键字改为let/匿名函数自调用。