显然:在函数外部无法访问内部的局部变量:
function f1(){ var n = 9999 ; } alert(n) ; //error
当需要这样做时,可以使用闭包。
闭包: 闭包函数就是一个嵌套结构的函数,在一个函数内定义一个函数。
由于在javascript语言中,子对象可以向上一级一级的寻找所有父元素的变量,父元素的所有变量对子元素都是可见的,反之,不成立。
所以内嵌函数可以访问定义在外层函数中的所有变量和函数。但是从函数外部不能访问函数的内部变量和嵌套函数。当需要从函数外部获取内部的局部变量时,可以使用闭包:
function f1(){ var n = 0 ; function f2(){ return n +=1; } return f2; } var add = f1(); console.log(add()); //1 console.log(add()); //2 console.log(add()); //3
函数f2嵌套在函数f1内部,函数f1返回函数f2,变量add指向函数f2。
在f1执行完并返回后,闭包使得javascript的垃圾回收机制不会回收f1所占用的资源(因为f2的执行依赖于f1中的变量),造成函数中的变量都被保存在内存中。
闭包的使用场景:提升效率:1.需要读取函数内部的变量; 2.让这些变量的值始终保存在内存中。
闭包的缺点: 变量一直在内存中会让内存消耗过大,闭包同时关系到内存和执行速度。不能滥用闭包。
匿名函数:
匿名函数是没有名字的函数,当代码只需运行一次时,匿名函数有利于减少函数名称冲突的风险,有效避免全局变量的污染。
语法格式:
function (){ //函数体 }
匿名函数自调用:
( function() { // 函数体; }) ();
也可以把匿名函数赋值给某个对象的事件,在解释器经过时会立即运行:
比如:
window.onload = function () { alert("页面加载完毕。"); };
原文:https://www.cnblogs.com/mingnai/p/12289335.html