码迷,mamicode.com
首页 > 其他好文 > 详细

闭包‘

时间:2019-08-18 21:37:16      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:内部函数   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!