闭包学习

原创 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 学习笔记 [1] 类型 值 集合 函数 闭包

这里只放了一些我觉得和其他语言不一样,以及我想加深的内容。仅仅做个学习补充,如果发现有的东西你完全没概念,就该去查看官方文档。 类型 值 集合 函数 闭包

javascript学习笔记(二)-闭包

闭包的理解和使用是学习js绕不过去的一道坎,为此笔者在阅读《javascript权威指南》的基础上又参考了几篇博客,终于了解个大概,下面就来和大家分享分享。

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

IOS学习笔记(页面传值:属性传值,协议代理传值,闭包传值)

1.属性传值,代理协议传值 创建视图控制区,导航视图控制器 在AppDelegate类下  func application()方法下   let vc = ViewControll...

Swift2.2 学习笔记(三) ___函数和闭包

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...

Python学习笔记之函数作为返回值、闭包的解释

高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 我们来实现一个可变参数的求和。通常情况下,求和的函数是这样定义的: def calc_sum(*args): ax =...

iOS学习笔记42-Swift(二)函数和闭包

上一节我们讲了Swift的基础部分,例如数据类型、运算符和控制流等,现在我们来看下Swift的函数和闭包一、Swift函数函数是一个完成独立任务的代码块,Swift中的函数不仅可以像C语言中的函数一样...

jQuery闭包学习笔记

定义这些就不说了,往下面看就理解了,有demo[例1]使用闭包结构能够跟踪动态环境中数据的实时变化 function f() { var a = 1 ;//定义局部变量a,初始...

学习Javascript闭包(Closure)

转载地址: http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html 闭包(closure)是...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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