闭包

181 阅读1分钟

闭包是什么 闭包有什么用

js没有块级作用域 全局变量和局部变量

闭包 就是定义在函数内部 能读取函数内部变量的函数 的函数

闭包是为了解决函数内部与外部的通讯问题

function f1(){
    var a=1;
    function f2(){
      console.log(a);
    }
    return f2; 
}
function f1(){
    var a=1;
    return function f2(){
      console.log(a);
    }
}

a   //1
f2()()  //1

f2为f1内部的函数 f2能读取f1内的说有变量 而f1不能读取f2内的变量 f1内定义一个f2,把f2返回出来,相当于把f2所处的【链式作用域】返回到外部 f1外部

function f1(){
    var a=1;    
    add=function(){    //全局变量add?
        a+=1;
    }
    return function f2(){
        console.log(a);
    }
}

var result=f1();  //把f2保存到result中
result();    //f1()()   1
add();
result();    //2

add是一个匿名函数,匿名函数本身就是一个闭包,相当于一个setter result实际上是函数f2,所以f2被保存到内存中,而f2用到f1的变量a所以f1被保存到内存中

var name="the window";
var object={
    name:"the object",
    getName:function(){
        return function(){
            return this.name  //这里的this是有上下文的
        }
    }
}

console.log(object.getName()()); 
//console.log(){
//  function(){
//       return this.name
//  }
//}
var name="the window";
var object={
    name:"the object",
    getName:function(){
        var that=this
        return function(){
            return that.name
        }
    }
}

console.log(object.getName()()); 
//console.log(){
//  function(){
//       return that.name
//  }
//}
var name="the window";
var object={
    name:"the object",
    getName:function(){
        return this.name;
    }
}

object.getName()  //the object

mozilla closures

学习Javascript闭包(Closure)

破解前端面试(80% 应聘者不及格系列):从 闭包说起