闭包学习

原创 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就是传说中的闭包。

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

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

相关文章推荐

js闭包写法学习demo

  • 2014年12月11日 18:06
  • 4KB
  • 下载

Swift闭包学习

  • 2016年03月31日 12:30
  • 16KB
  • 下载

JS学习笔记:JavaScript匿名函数与闭包(closure)

这部分之所以会放在一起整理,是因为匿名函数和闭包的概念很容易混淆,经常会用错。闭包是JavaScript的一个难点,也是它的一个特色,很多高级应用都要通过闭包实现,正确的理解和使用闭包是很重要的。闭包...

js中的继承和闭包的学习

js中含有继承,但不是extends关键字来实现继承的,怎样实现呢?先看一下代码: function Stu(name, age) { this.name = name; t...

nodejs学习笔记二:闭包和异步编程

闭包到底是什么鬼闭包就是函数��,但是它可以继承并访问它自身被声明的那个作用域里的变量。当你将一个回调函数作为参数传递给另外一个进行i/o操作的函数时,回调函数稍后会被调用,神奇的是,在被调用时,回调...

Swift编程语言学习6—— 闭包

闭包是自包含的函数代码块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的 lambdas 函数比较相似。   闭...
  • zpf8861
  • zpf8861
  • 2014年07月16日 09:40
  • 1147

JavaScript 闭包学习笔记

本文简单记录学习 JavaScript 闭包的知识点。
  • zhaizu
  • zhaizu
  • 2016年02月20日 23:00
  • 535

初探swift语言的学习笔记三(闭包-匿名函数)

swfit 中匿名函数的使用

韩顺平 javascript教学视频_学习笔记20_多态经典案例_补讲闭包细节

多态经典案例 经典案例,看代码: function Master(){ //给动物喂食 this.feed=f...

JavaScript中闭包学习 --2016.4.7

JavaScript中闭包学习 –2016.4.7最近在看prototype.js源码,发现里面有很多的有意思的代码,了解到了javascript的闭包思想,然后通过网上的资料和自己敲代码,来学习它,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:闭包学习
举报原因:
原因补充:

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