JS闭包

作用域

  • js只有函数作用域没有块作用域
  • js函数内部可以直接读取全局变量
  • 内部函数可以访问外部函数的变量,外部函数无法访问内部函数的局部作用域
var a = 100;
function fn(){
    console.log(a)// 100
}

function fn2(){
    var b = 200;
    function fn3(){
        console.log(b)// 200
    }
}

function fn3() {
    var c = 300;
}
console.log(c)// undefined

问题

  • 如何在函数外部读取函数内部的局部作用域
function fn4() {
    var d = 400;
    return function() {
        console.log(d)
    }
}
var temp = fn4();
temp();// 400

闭包定义

  • 闭包就是能够读取其它函数内部变量的函数
  • 由于js中只有函数内部的子函数才能读取局部变量,所以闭包可以认为是‘定义在一个函数内部的函数’

闭包的作用

  • 读取函数内部的变量
  • 让这些局部变量始终保存在内存中
var gtemp = null;
function fn5(){
    var n = 1;
    gtemp = function(){
        n += 1;
    }
    return function(){
        console.log(n)
    }
}
var temp = fn5();
temp();// 2
gtemp();
temp();// 3

注意:第一次调用temp自加1
调用gtemp()方法自加1
在次调用temp方法时n并没有在fn5调用完释放,而是继续自加1
fn5内部匿名函数赋值给全局变量,匿名函数无法释放,因为匿名函数的存在依赖于fn5函数,所以fn5也始终在内存中不会在调用完后被gc

var gv = 'the window'
var objects = {
    gv: 'the name',
    objFun: function(){
        return function(){
            return this.gv;
        }
    }
}
console.log(objects.objFun())// the window

var gv = 'the window'
var objects = {
    gv: 'the name',
    objFun: function(){
        var self = this;
        return function(){
            return self.gv;
        }
    }
}
console.log(objects.objFun())// the name

闭包的概念

当内部函数 在定义它的作用域(js中只有函数作用域)的外部被引用时,就创建了该内部函数的闭包 ,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被释放,因为闭包需要它们.

posted @ 2016-07-12 14:44  小旋风小王爷  阅读(122)  评论(0编辑  收藏  举报