JavaScript闭包
闭包理解
<script type="text/javascript"> function fn1 () { var a = 2 var b = 'abc' //执行函数定义就会产生闭包(不用调用内部函数) function fn2 () { console.log(a) } // fn2() } fn1() function fun1() { var a = 3 var fun2 = function () { console.log(a) } } fun1() </script>
常见的闭包
<script type="text/javascript"> // 1. 将函数作为另一个函数的返回值 function fn1() { var a = 2 function fn2() { a++ console.log(a) } return fn2 } var f = fn1() f() // 3 f() // 4 // 2. 将函数作为实参传递给另一个函数调用 function showDelay(msg, time) { setTimeout(function () { alert(msg) }, time) } showDelay('abc', 2000) </script>
闭包的作用
闭包的生命周期
<script type="text/javascript"> function fn1() { //此时闭包就已经产生了(函数提升, 内部函数对象已经创建了) var a = 2 function fn2 () { a++ console.log(a) } return fn2 } var f = fn1() f() // 3 f() // 4 f = null //闭包死亡(包含闭包的函数对象成为垃圾对象) </script>
闭包的应用
定义JS模块
(function () { //私有数据 var msg = 'My Module' //操作数据的函数 function doSomething() { console.log('doSomething() '+msg.toUpperCase()) } function doOtherthing () { console.log('doOtherthing() '+msg.toLowerCase()) } //向外暴露对象(给外部使用的方法) window.myModule2 = { doSomething: doSomething, doOtherthing: doOtherthing } })()
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>闭包的应用_自定义JS模块</title> </head> <body> <script type="text/javascript" src="myModule.js"></script> <script type="text/javascript"> myModule2.doSomething() myModule2.doOtherthing() </script> </body> </html>
闭包的缺点及解决
<script type="text/javascript"> function fn1() { var arr = new Array[100000] function fn2() { console.log(arr.length) } return fn2 } var f = fn1() f() f = null //让内部函数成为垃圾对象-->回收闭包 </script>
内存溢出和内存泄漏
闭包面试题
<script type="text/javascript"> //面试题一 var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()()); //The Window//面试题二 var name2 = "The Window"; var object2 = { name2 : "My Object", getNameFunc : function(){ var that = this; return function(){ return that.name2; }; } }; alert(object2.getNameFunc()()); //My Object </script>
<script type="text/javascript"> // 面试题三 function fun(n,o) { console.log(o) return { fun:function(m){ return fun(m,n) } } } var a = fun(0) a.fun(1) a.fun(2) a.fun(3)//undefined,0,0,0 var b = fun(0).fun(1).fun(2).fun(3)//undefined,0,1,2 var c = fun(0).fun(1) c.fun(2) c.fun(3)//undefined,0,1,1 </script>