<body> <!-- 1。如何产生闭包? *当一个嵌套的内部(子)函数引用嵌套的外部(父)函数的变量(函数)时,就产生了闭包 2.闭包到底是什么? 使用chrome调试查看 理解一:闭包是嵌套的内部函数(绝大部分人) 理解二:包含被引用变量(函数)的对象(极少数人) 注意:闭包存在于嵌套的内部函数中 3.产生闭包的条件? 函数嵌套 内部函数引用了外部函数的数据(变量/函数) --> <script> function fn1(){ var a =2 var b = ‘22‘//闭包里面没有b
如果是var fn = function(){ //这样就不产生闭包
console.log(a)
}
function fn2(){ //执行函数定义才能产生闭包(有函数提升),也就是一定要执行外部函数,执行了函数定义才会产生变量,不一定要执行内部函数(fn2) console.log(a) //闭包里面有a } fn2() } fn1() </script> </body>
执行函数定义才能产生闭包,也就是一定要执行外部函数,执行了函数定义才会产生变量,不一定要执行内部函数(fn2)
常见的闭包
<body> <!-- 1.将函数作为另一个函数的返回值 2.将函数作为实参传递给另一个函数调用 --> <script> //1.将函数作为另一个函数的返回值 function fn1(){ var a = 2 function fn2(){ a++; console.log(a) } return fn2 } var f = fn1() //闭包产生了 f() //3 f是调用内部函数,不是外部函数 f() //4 //请问整个过程中创建几个内部函数对象?一个!!! 内部函数是执行函数,并不是创建函数 //看闭包对象创建几个,就看你外部函数对象执行几次,因为创建外部函数对象,才会去创建内部函数对象,和内部函数执行几次没有关系,也就是和f()执行几次没有关系。因为执行外部函数时,执行了内部的函数定义,产生了变量。 //2.将函数作为实参传递给另一个函数调用 function showDelay(msg,time){ setTimeout(function(){ alert(msg) },time) } showDelay(‘fds‘,2000) //内部函数function(){alert(msg)}闭包里面有msg,如果没有msg,就没有闭包 </script> </body>
看闭包对象创建几个,就看你外部函数对象执行几次,因为创建外部函数对象,才会去创建内部函数对象,和内部函数执行几次没有关系,也就是和f()执行几次没有关系。因为执行外部函数时,执行了内部的函数定义,产生了变量。
原文:https://www.cnblogs.com/lucy-xyy/p/11718731.html