标签:内部函数 color 它的 空间 引用 利用 his 一个 function
一般来讲,当函数执行完毕后,局部活动对象就会被销毁内存中仅保存全局作用域(全局执行环境的变量对象),但闭包又有所不同,
在另一个函数内部定义的函数会将包含函数(外部函数)的活动对象添加到它的作用域链中。当外部函数执行完毕后,其活动对象不会被销毁
因为内部函数的作用域链仍然在引用这个活动对象,。换句话说,当外部函数的执行完后,其执行环境的作用域链会被销毁,但他的活动对象
仍然会留在内存中,直到内部幻术被销毁后,外部的函数对象才会被销毁。
闭包域变量
闭包不属于任何对象,它不是一个对象的方法(就不能使用点运算符来调用)
闭包只能取得包含函数中任何变量的最后一个值,闭包所保存的是整个变量对象,而不是某个特殊的变量
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里面的代码,同时所有的定义比如变量的作用域都在闭包里,不会污染到外部命名空间
标签:内部函数 color 它的 空间 引用 利用 his 一个 function
原文地址:https://www.cnblogs.com/psxiao/p/11373874.html