闭包‘
Posted psxiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了闭包‘相关的知识,希望对你有一定的参考价值。
一般来讲,当函数执行完毕后,局部活动对象就会被销毁内存中仅保存全局作用域(全局执行环境的变量对象),但闭包又有所不同,
在另一个函数内部定义的函数会将包含函数(外部函数)的活动对象添加到它的作用域链中。当外部函数执行完毕后,其活动对象不会被销毁
因为内部函数的作用域链仍然在引用这个活动对象,。换句话说,当外部函数的执行完后,其执行环境的作用域链会被销毁,但他的活动对象
仍然会留在内存中,直到内部幻术被销毁后,外部的函数对象才会被销毁。
闭包域变量
闭包不属于任何对象,它不是一个对象的方法(就不能使用点运算符来调用)
闭包只能取得包含函数中任何变量的最后一个值,闭包所保存的是整个变量对象,而不是某个特殊的变量
function createFunction()
var result = new Array();
for(var i = 0;i< 10;i++)
console.log(i)//0,1,2,3,4,5,6,7,8,9
setTimeout(result[i] = function()
console.log(this,390)//window;;匿名函数中的this指向的是windows,和全局变量一样
console.log(i)//i=10
return i;
)
console.log(result)//打印出数组函数,打印出10个匿名函数function()
return result;
createFunction();
解决办法:
function createFunction()
var result = new Array();
for(var i = 0;i< 10;i++)
//立即执行函数:和普通函数传参一样,立即执行函数也可以传递参数。如果在函数内部定一个函数,而里面的那个函数能引用外部的变量和参数(闭包),我们就能用立即执行函数锁定变量保存状态。
//num参数是从外边传进来的,该形参相当于一个变量会存在于里面的那个闭包函数中,所以即使外面的i改变了,里边的i也不会改变
result[i] = function(num)
console.log(num)//0,1,2,3,4,5,6,7,8,9
return function()
console.log(num,423)
return num;//访问传进来的num
(i);
return result;
var a = createFunction();
console.log(a)
//用(function()xxxx)()是利用匿名函数和闭包函数来执行xxx里面的代码,同时所有的定义比如变量的作用域都在闭包里,不会污染到外部命名空间
以上是关于闭包‘的主要内容,如果未能解决你的问题,请参考以下文章
Groovy闭包 Closure ( 自定义闭包参数 | 自定义单个闭包参数 | 自定义多个闭包参数 | 闭包参数默认值指定 )
Groovy闭包 Closure ( 闭包定义 | 闭包类型 | 查看编译后的字节码文件中的闭包类型变量 )
iOS开发-Swift进阶之闭包,逃逸闭包 & 非逃逸闭包!
Groovy闭包 Closure ( 闭包调用 | 闭包默认参数 it | 代码示例 )