闭包学习

原创 2016年08月31日 10:53:30

学习javascript的时候,闭包总是一个难点。发现自己比较笨,所以决定要养成写博客的习惯,也许这样才不会把学到的知识丢掉。因为有时候想明白这个闭包的东西了,但是时间一久就会忘。

作用域

//window
var num  = 10;
function changeNum(){
    var myNum = 90;
    function cha(){
        var temNum = myNum;
        myNum = num;
        num   = temNum;
    }
    cha();
}
changeNum();

上面代码中,num变量就是全局变量,方法changeNum()内部的变量都是局部变量。而且方法内部可以访问num,但是changeNum()之外不能访问myNum.这样就说明他们有个自己的作用域。

执行环境作用域链

var nameStr = "I am window";
function fun(){
    var nameStr = "I am fun";
    return function(){
        console.log(nameStr);
    }
}
var f = fun();
    f();

每个函数都会有它的执行环境,当执行到一个函数时,就会将其环境推入执行环境栈中,函数执行完后,再将其弹出,返回到之前的执行环境。

比如以上代码,当执行到var f = fun();的时候,会将fun()方法的执行环境推入执行环境栈中,当fun()执行完后,回到之前的执行环境,也就是window中继续往下走。

而每个执行环境又有它自己的变量对象,里面保存着其中定义的变量和函数。

比如以上代码:在执行var f = fun();之前,当前的执行环境时window,他自己的变量对象是nameStr ,fun等。而fun()的执行环境就是它内部的变量。

当代码在一个环境中执行时,会形成一个变量对象的作用域链,当前环境的变量对象在最前端,其外部函数执行环境的变量对象在下一级,一直回溯到全局环境的变量对象。作用域链是保证了对执行环境有权访问的所有变量和函数的有序访问。当访问一个变量的时候,会从作用域链的最前端开始搜索,逐级向上。

闭包

闭包的概念在各种文献上定义确实比较难懂,这里我在大牛阮一峰的博客里看到最简单的最易懂的解释:闭包就是能够读取其他函数内部变量的函数。

var nameStr = "I am window";
function fun(){
    var nameStr = "I am fun";
    var f1 = function(){
        console.log(nameStr);
    }
    return f1;  
}
var f = fun();
    f();   // "I am fun"

上面的代码中f1就是传说中的闭包。

闭包的作用:
一个是可以读取函数内部的变量;
另一个就是让这些变量的值始终保持在内存中。

基于闭包的作用同时也有需要注意的地方:
不能滥用闭包。

swift学习之- 闭包

一、闭包的概念      在swift中的闭包中被称为结构块,可以在任何地方被调用,它就像C和OC语言中的内置函数一样。函数内部定义的常量和变量引用可被捕获并存储在闭包。闭包可分为三大类: 1、全局函...
  • wangxuejuan1125
  • wangxuejuan1125
  • 2017年01月23日 10:24
  • 66

漫步数学分析七——集合的闭包

集合AA的内部是AA的最大开子集,同样地,我们也能构造一个包含AA的最小闭集,这个集合就成为AA的闭包(closure)并用cl(A)\text{cl}(A)或A¯\bar{A}表示。定义5\text...
  • u010182633
  • u010182633
  • 2017年01月05日 15:56
  • 2813

如何有效的使用闭包

【译】如何有效地使用闭包 2016-05-23 JavaScript 译者:Jason(https://l-movingon.github.io/posts/2016-05-06-...
  • qq_28489043
  • qq_28489043
  • 2016年08月16日 13:00
  • 278

Swift 闭包的使用(尾随闭包)

-闭包的使用     提问:block 的应用场景是什么?       1. `网络(异步的)代码添加到队列,队列调度完成` -> 回调     无法通过返回值通知调用方       2. 回调...
  • dingwenchao456
  • dingwenchao456
  • 2016年03月08日 17:30
  • 1352

Java中的闭包之实例一

闭包(Closure)是一种能被调用对象,它保存了创建它的作用域的信息。 Java并不能显式地支持闭包,但对于非静态内部类而言,它不仅记录了其外部类的详细信息,还保留了一个创建非静态内部类对象的引用...
  • renaissance_joker
  • renaissance_joker
  • 2017年04月17日 23:09
  • 592

C# 闭包解析

背景知识 你必须了解:引用类型、值类型、引用、对象、值类型的值(简称值)。 关于引用、对象和值在内存的分配有如下几点规则: •对象分配在堆中。 •作为字段的引用分配在堆中(内嵌在对象中)...
  • cjolj
  • cjolj
  • 2017年03月08日 10:46
  • 801

闭包(Java中的闭包)

闭包Java中的闭包 What 简单理解 WHY HOW Java中的闭包 内部类 局部内部类 匿名内部类 闭包(Java中的闭包):What 闭包是指可以包含自由(未绑定到特定对象)变量的代码块;这...
  • yztbydh
  • yztbydh
  • 2017年07月28日 17:20
  • 1010

【Python】闭包中一个不易察觉的陷阱

Python语言是支持函数式编程的,我们可以在一个函数的函数体中定义另一个完整的函数,甚至返回这个函数.在函数内部定义的函数和外部定义的函数是相同的,唯一的区别就是在函数内部定义的函数是不能被外部访问...
  • lchad
  • lchad
  • 2015年02月27日 15:52
  • 4036

C++11闭包函数:Lambda表达式的使用λ

C++11中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda的语法形式如下: [函数对象参数] (操作符重载函数参数) mutable或exception声明 -> 返...
  • JarrettLife
  • JarrettLife
  • 2016年06月23日 18:58
  • 2989

闭包题目

var x = 20; var a = { x: 15, fn: function() { var x = 30; return function()...
  • qq_31628337
  • qq_31628337
  • 2017年03月11日 10:38
  • 668
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:闭包学习
举报原因:
原因补充:

(最多只允许输入30个字)