最近在学习前端知识,看到javascript闭包这里总是云里雾里。于是翻阅了好多资料记录下来本人对闭包的理解。

首先,什么是闭包?看了各位大牛的定义和描述各式各样,我个人认为最容易一种说法:

外部函数执行完成之后,内部函数依然可以访问外部函数的成员变量。这种现象叫做闭包

看看下面的代码:

function a () {
  var temp = "hello world";
  function b () {
    alert(temp);
  }
  return b;
 }
var test = a();
test();

这是一个经典闭包例子,b在执行的时候,a已经执行过了,但是b() 依然会返回"hello world",b函数是用了a函数的成员变量这就是闭包。

还有一个典型案例这里需要说明下:

html代码:

<div id="divTest">
  <span>0</span> <span>1</span> <span>2</span> <span>3</span>
</div>

js代码:

var spans = $("#divTest span");
  for (var i = 0; i < spans.length; i++) {
  spans[i].onclick = function () {
    alert(i);
  }
}

结果是每个span点击都弹出4,并不是我们想象的0,1,2,3

这因为在实际点击的时候还是能访问外部函数(外部函数已经执行结束,但是没有被销毁)的成员变量i,

由于每次外部函数在执行的时候都会重建作用域链中的变量,所以会发现循环了4次i之后,每个span的点击都是4。

一般解决这种闭包问题就是把公用的变量变成自己的,所以这样就这么解决。
var spans = $("#divTest span");
for (var i = 0; i < spans.length; i++) {
  spans[i].onclick = function () {
    var x = i;
    alert(x);
  }
}
这样大家都不公用父函数的,而是用自己的就正常了。
 
关于作用链只要记住以下几点就可以啦:
1.javascript中全局变量不能访问局部的变量,局部变量可以访问全局变量。
2.在局部中使用变量,如果当前函数中没有该变量,解析器会自动去父级作用域中寻找,如果父级没有会继续寻找更上一级的作用域,直到找到全局作用域如果还没有则返回undefined。
3.作用链就是逐级向上找的一个过程。
 

javascript闭包和作用域链的更多相关文章

  1. Javascript——闭包、作用域链

    1.闭包:是指有权访问另一个函数作用域中的变量的函数.创建闭包的常见方式:在一个函数内部创建另一个函数. function f(name){ return function(object){ var ...

  2. Javascript中闭包的作用域链

    作用域定义了在当前上下文中能够被访问到的成员,在Javascript中分为全局作用域和函数作用域,通过函数嵌套可以实现嵌套作用域. 闭包一般发生在嵌套作用域中.闭包是JavaScript最强大的特性之 ...

  3. javascript笔记:javascript的关键所在---作用域链

    javascript里的作用域是理解javascript语言的关键所在,正确使用作用域原理才能写出高效的javascript代码,很多javascript技巧也是围绕作用域进行的,今天我要总结一下关于 ...

  4. javascript的关键所在---作用域链

    javascript的关键所在---作用域链 javascript里的作用域是理解javascript语言的关键所在,正确使用作用域原理才能写出高效的javascript代码,很多javascript ...

  5. [ JS 进阶 ] 闭包,作用域链,垃圾回收,内存泄露

    原网址:https://segmentfault.com/a/1190000002778015 1. 什么是闭包? 来看一些关于闭包的定义: 闭包是指有权访问另一个函数作用域中变量的函数 --< ...

  6. JS闭包、作用域链、垃圾回收、内存泄露相关知识小结

    补充: 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包的三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数和变 ...

  7. JavaScript 中的闭包和作用域链(读书笔记)

    要想理解闭包,应当先理解JavaScript的作用域和作用域链. JavaScript有一个特性被称之为“声明提前(hoisting)”,即JavaScript函数里声明的所有变量(但不涉及赋值)都被 ...

  8. javascript深入浅出图解作用域链和闭包

    一.概要 对于闭包的定义(红宝书P178):闭包就是指有权访问另外一个函数的作用域中的变量的函数. 关键点: 1.闭包是一个函数 2.能够访问另外一个函数作用域中的变量 文章首发地址于sau交流学习社 ...

  9. [译]JavaScript:函数的作用域链

    原文:http://blogs.msdn.com/b/jscript/archive/2007/07/26/scope-chain-of-jscript-functions.aspx 在JavaScr ...

随机推荐

  1. bash/shell编程学习(1)

    1)定义变量 myvar=abc #注:等号前后不能加空格 #或 myvar="abc" #或 myvar='abc' #注:如果变量后面的值中间本身没有空格,加不加引号都无所谓, ...

  2. 阅读ArrayBlockingQueue源码了解如何利用锁实现BlockingQueue

    BlockingQueue是多线程里面一个非常重要的数据结构.在面试的时候,也常会被问到怎么实现BlockingQueue.本篇根据Java7里ArrayBlockingQueue的源码,简单介绍一下 ...

  3. FineUI小技巧(6)自定义页面回发

    前言 FineUI中的绝大部分回发事件都是由控件触发了,比如按钮的点击事件,下拉列表的改变事件,表格的排序分页事件.但有时我们可能会要自己触发页面回发,这时就要知道怎么使用 JavaScript 来做 ...

  4. JavaScript模板引擎artTemplate.js——template()方法

    template(id, data)方法: id:必传,渲染模板的id. data:可选,一个Object对象. return:传data—>渲染完成html代码:不传data—>一个渲染 ...

  5. java中文文档官方下载

    一直在寻找它,今天无意之间终于发现它了! http://download.oracle.com/technetwork/java/javase/6/docs/zh/api/overview-summa ...

  6. linux基础知识与技能3

    3.2.vi的高级使用* 查找在命令模式下,输入/xxx,就可以查找到xxx * 快速切换行在命令模式下,输入:num,就可以快速切换到num行 * 设置显示行号在命令模式下,输入:set nu,就可 ...

  7. JQuery中Ajax的操作

    JQuery   Ajax异步操作的方式: $.ajax,$.post, $.get, $.getJSON. 一, $.ajax,这个是JQuery对ajax封装的最基础步,通过使用这个函数可以完成异 ...

  8. JS:offsetWidth\offsetleft 等图文解释

        网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见区域宽: document.body.of ...

  9. 设计模式 “续”

    观察者模式 再次申明,本文学习自 程杰 兄的 "大话设计模式" 根据书中的内容和自己的体会而来. 观察者模式也叫 发布.订阅模式,在这个模式里,一个目标物件管理所有依赖它的观察者物 ...

  10. sql语句的单双引号问题

    $current_account_url='<a class="mini-button" iconcls="icon-edit" onclick=&quo ...