在JavaScript中,作用域是执行代码的上下文。作用域有3种类型:

1.全局作用域

2.局部作用域---(又叫函数作用域)

3.eval作用域

var foo =0;//全局作用域

console.log(foo);//输出 0
var myFunction =function(){
  var foo =1;//局部作用域
  console.log(foo);//输出 1
  
  var myinnerFunction =function(){
    var foo =2;//局部作用域
    console.log(foo);//输出 2
  }();
}();
eval('var foo = 3; console.log(foo);');//eval()作用域

在函数内部使用var定义的代码,其作用域是局部的,且只对该函数的其他表达式是可见的,包括嵌套/子函数中的代码。

var a = "Hello";//
(function b() {//只执行函数b()
alert(a); //undefined
var a = "World";
alert(a);
})()
alert(a); //Hello

JavaScript没有块作用域

JavaScript中if(){}、for无法创建作用域

var foo=1;//foo等于1
if(true){
foo =2;//foo等于2
for (var i=3;i<=5;i++){
foo=i;
console.log("nei:"+foo)
} }
console.log("wai:"+foo)
结果:
//nei:3
//nei:4
//nei:5
//wai:5

if条件里面与for循环之后内部的结果在下面console.log("wai:"+foo)打印出来的结果是5,说明JavaScript没有块级作用域,只有函数作用域与全局作用域与eval作用域。

其他语言里面的块级作用域:由花括号封闭的代码块都有自己的作用域,也就是块级作用域(私有作用域)-----花括号是他们作用域的边界,而js的块级作用域边界是function。详细介绍可参阅http://www.cnblogs.com/fengmiaosen/archive/2011/01/10/1932403.html

 js闭包

网上有很多种解说,其中有一种比较容易理解的说法:

js分全局作用域和函数作用域。函数作用域里可以访问到全局,通过一个叫作用域链的东西。但全局怎么访问函数呢?就有人想了在函数里面再写一个函数(闭包),这样把作用域链加长了。就可以在全局访问到函数里的数据了。闭包能访问到父级函数里面的数据说明父级里的数据一直存在内存中(闭包存在的情况下),这就会导致内存一直被占着

简而言之闭包就是能够读取其他函数内部变量的函数。

总结:闭包它的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
var countFromZero =function(){
  var count =0;
  return function(){//调用countFromZero的时候返回嵌套的子函数
    return ++count ;//count的作用域链定义在父函数里
  }
}()
countFromZero()//输出1
countFromZero()//输出2
countFromZero()//输出3 变量的值始终保持在内存中不会被立即释放出来,每调用一次countFromZero(),count就会加1,而不是调用外出函数后count立刻被清除

注意:由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,必要的时候适当销毁

闭包 js回收机制

回收规则如下:

    1.全局变量不会被回收。

    2.局部变量会被回收,也就是函数一旦运行完以后,函数内部的东西都会被销毁。

     3.只要被另外一个作用域所引用就不会被回收

作用域名字解析顺序 

javascript中一个名字(name)以四种方式进入作用域(scope),其优先级顺序如下:
1、语言内置:所有的作用域中都有 this 和 arguments 关键字
2、形式参数:函数的参数在函数作用域中都是有效的
3、函数声明:形如function foo() {}
4、变量声明:形如var bar;

名字声明的优先级如上所示,也就是说如果一个变量的名字与函数的名字相同,那么函数的名字会覆盖变量的名字,无论其在代码中的顺序如何。但名字的初始化却是按其在代码中书写的顺序进行的,不受以上优先级的影响。看代码:

(function(){
var foo;
console.log(typeof foo); //function function foo(){} foo = "foo";
console.log(typeof foo); //string
})();

闭包参考链接

https://www.zhihu.com/question/34510484/answer/59303912

http://www.cnblogs.com/uedt/archive/2010/10/28/1863389.html

http://www.cnblogs.com/liyatang/archive/2011/08/05/2128102.html

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

  1. javascript作用域和闭包之我见

    javascript作用域和闭包之我见 看了<你不知道的JavaScript(上卷)>的第一部分--作用域和闭包,感受颇深,遂写一篇读书笔记加深印象.路过的大牛欢迎指点,对这方面不懂的同学 ...

  2. JavaScript 作用域和闭包——另一个角度:扩展你对作用域和闭包的认识【翻译+整理】

    原文地址 --这篇文章有点意思,可以扩展你对作用域和闭包的认识. 本文内容 背景 作用域 闭包 臭名昭著的循环问题 自调用函数(匿名函数) 其他 我认为,尝试向别人解释 JavaScript 作用域和 ...

  3. 举例详细说明javascript作用域、闭包原理以及性能问题(转)

    转自:http://www.cnblogs.com/mrsunny/archive/2011/11/03/2233978.html 这可能是每一个jser都曾经为之头疼的却又非常经典的问题,关系到内存 ...

  4. JavaScript 作用域和闭包

    作用域的嵌套将形成作用域链,函数的嵌套将形成闭包.闭包与作用域链是 JavaScript 区别于其它语言的重要特性之一. 作用域 JavaScript 中有两种作用域:函数作用域和全局作用域. 在一个 ...

  5. javascript作用域、闭包、对象与原型链

    原文作者总结得特别好,自己收藏一下.^-^ 1.作用域1.1函数作用域JS的在函数中定义的局部变量只对这个函数内部可见,称之谓函数作用域.它没有块级作用域(因此if.for等语句中的花括号不是独立作用 ...

  6. javascript作用域与闭包

    Javasript作用域概要 在javascript中,作用域是执行代码的上下文,作用域有三种类型: 1)  全局作用域 2)  局部作用域(函数作用域) 3)  eval作用域 var foo = ...

  7. JavaScript作用域与闭包总结

    1.全局作用域 所有浏览器都支持 window 对象,它表示浏览器窗口,JavaScript 全局对象.函数以及变量均自动成为 window 对象的成员.所以,全局变量是 window 对象的属性,全 ...

  8. javascript——作用域与闭包

    http://www.cnblogs.com/lucio-yr/p/4047972.html 一.作用域: 在函数内部:用 var 声明的表示局部变量,未用var的是全局变量. 作用域取决于变量定义时 ...

  9. 《JavaScript 闯关记》之作用域和闭包

    作用域和闭包是 JavaScript 最重要的概念之一,想要进一步学习 JavaScript,就必须理解 JavaScript 作用域和闭包的工作原理. 作用域 任何程序设计语言都有作用域的概念,简单 ...

随机推荐

  1. HTTP TCP UDP Socket 关系的几个经典图

      从上图可以看到,TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传输层中有TCP协议与UDP协议. ...

  2. Struts2 回顾总结

    1.第一个Struts2入门案例 1.找jar包 Struts2-core xwork-core ognl javasist freemarker commons-lang commons-io co ...

  3. webbench之使用(二)

    [root@lam7 ~]# webbench -helpwebbench [option]... URL -f|--force                Don't wait for reply ...

  4. BZOJ 3105 [CQOI2013]新Nim游戏 ——线性基

    [题目分析] 神奇的题目,两人都可以第一次取走足够多堆的石子. nim游戏的规则是,如果异或和为0,那么就先手必输,否则先手有必胜策略. 所以只需要剩下一群异或和为0就可以了. 先排序,线性基扫一遍即 ...

  5. 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)

    本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...

  6. Oracle 取随机数

    1.从表中随机取记录 select * from (select * from staff order by dbms_random.random)      where rownum < 4 ...

  7. 巴特沃斯(Butterworth)滤波器 (1)

    下面深入浅出讲一下Butterworth原理及其代码编写. 1. 首先考虑一个归一化的低通滤波器(截止频率是1),其幅度公式如下: 当n->∞时,得到一个理想的低通滤波反馈: ω<1时,增 ...

  8. BC一周年练习赛

    Souvenir  Accepts: 901  Submissions: 2743  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 262 ...

  9. 前端性能监控方案window.performance 调研(转)

    1. 业界案例 目前前端性能监控系统大致为分两类:以GA为代表的代码监控和以webpagetest为代表的工具监控. 代码监控依托于js代码并部署到需监控的页面,手动计算时间差或者使用浏览器的的API ...

  10. ActiveMQ集群应用

    ActiveMQ集群 ActiveMQ具有强大和灵活的集群功能,但在使用的过程中会发现很多的缺点,ActiveMQ的集群方式主要由两种:Master-Slave和Broker Cluster. 1.M ...