三个闭包的理解的问题

想明确下就是:
1、2的条件是形成了自由变量

  1. 闭包的形成和函数结构有关,而不是在函数执行调用的时候形成的是吗?比如说函数嵌套函数的结构,内层函数没有调用,但是不妨碍形成闭包。
  2. 只要外层函数被调用了,外层函数中声明的变量值就一直保存在内存中,与内层函数是否被调用无关。只是内层函数被调用的时候,外层函数申明的变量值和内层函数申明的遍量值都被保存在内存中是吗?
  3. 在没有形成自由变量的情况下,只是结构上函数嵌套函数,算是闭包吗?如下代码:
function fn1(){
        var a=123;
        function fn2(){    
            var b=0        
            alert(b)
        }
    }
阅读 3.3k
4 个回答

1.可以不调用内层函数,但必须有外部变量保持对内层函数的引用,没有引用的话会被垃圾回收算法清掉;
2.同上,需要保持对内层函数的引用。只要引用存在,外层函数的变量是一直保存在内存中的,而不是调用的时候才加载;
3.fn2不会执行,因为你只是声明,并没有调用;即使调用也马上会被垃圾回收算法清掉,因为没有外部变量对其引用。可作如下改写

function fn1() {
  var a = 123;
  return function fn2() {
    var b = 0
    alert(b)
    console.log(a);
  }
}
var fn = fn1(); // 这里fn等于fn2,且fn2保留了对fn1作用域中变量a的引用
fn(); // alert(b) && console.log(123)

当然没有console的话a也是会保留在内存中的,但我个人认为不算闭包,因为没有对内部函数引用的变量

闭包很重要的特征是外部变量对内部函数的引用,这篇文章介绍的比较清楚
https://github.com/mqyqingfen...

把函数当作值来传递的才是闭包,只是嵌套肯定不是,return函数和作为参数调用才是闭包。

我看了一下,大家对闭包的理解好像不一样,我贴一片文章上来;
http://www.ruanyifeng.com/blo...

不过我个人的理解更倾向于闭包就是个匿名函数。

闭包说到底就是函数内部的[[Scope]]属性保存着父级上下文的变量。[[Scope]]有几个非常重要的特性:1静态(函数在哪里创建就保存该位置的父级上下文的变量)2创建即有(不管你调不调用,永远存在)3该函数被销毁时被销毁。4通过Fonction创建的构造函数的只能储存全局的变量(特殊的情况)。所有函数本质上都是闭包。例如:在全局函数中引用一个自由变量。在函数内部返回一个函数。举几个例子吧
1静态的特性
var x =100;
function a(){

console.log(x)

}
function b(){

var x =200;
a();//此处是100,不是200,因为函数a保存的是全局的x = 100

}
2共享的特性(如果在一个函数有多个函数,这些函数储存的是同一个[[Scope]])
var fn1,fn2;
function example(){

var x = 100;
fn1 = function(){
    //此刻储存的x为100
    return ++x
};
fn2 = function(){
   //此刻储存的也是100
   return --x
};

};
example();
console.log(fn1());//101
console.log(fn2());//100
3Function创建的构造函数的特性(特殊的情况)

var x = 100;
function example(){
    var x = 200;
    var fn = new Function("console.log(x)");
    fn();//100,不是200,通过Function创建的构造函数只能储存全局的变量
};
example()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题