函数作用域和闭包
 词法作用域  
  它们在定义它们的作用域里运行,而不是在执行的作用域运行,但是只有在运行时,作用域链中的属性才被
定义(调用对象),此时,可访问任何当前的绑定。
  调用对象      
  当JavaScript解释器调用一个函数,它首先将作用域设置为定义函数时起作用的那个作用域链,
然后在作用域最前面加上一个新的对象(调用对象)
所以函数内定义的局部变量以及函数的参数,都添加到调用对象的属性上,这意味着,它们隐藏了作用域链上更上层的任何的同名的属性
(变量寻找路径)
   作为闭包的嵌套函数
嵌入的函数在与它们定义的同一个词法作用域里调用。
外层函数被调用时,外层函数的作用域包含 外层函数的调用对象,以及全局对象。
嵌套函数被调用时,作用域链包含三个对象:嵌套函数的调用对象,外层函数的调用对象,全局对象。
 
1、当没有嵌套函数时,作用域链是对调用对象的惟一的引用,当函数退出结束时,调用对象也从链中移除了,也就没有对它的引用了,
最终被垃圾回收,释放内存。
 
2、如果创建了一个嵌套函数时,对嵌套函数的惟一的引用在嵌套函数的调用对象中(情况同上),当外围函数返回时,嵌套函数与外围函数的调用引用相互引用(嵌套函数当作此调用对象的属性,此调用对象相当于此函数的局部全局对象),但没有其他的东西引用它们二者,对这两个对象都可进行垃圾加收
 
3、如果把一个嵌套函数的引用保存到一个全局作用域中,情况又不同了(方法是:通过使用嵌套函数作为外围函数的返回值,并存储在一个全局对象的属性中,或存在某个外部对象的属性上来做到这一点,)。
 
在这种情况下,有一个对嵌套函数的外部引用,并且将其保留给外围函数的调用对象,此时,当外围函数返回时,不能通过垃圾收集对外围函数的一次特定调用对象进行清除,因为这个调用对象是嵌套函数的局部全局对象,直到这个对嵌套函数的引用消除为此。
那么外围函数的参数和局部变量的名字和值在这个对象中得以维持。嵌套函数的调用对象,它所定义的属性是对嵌套函数任何调用的作用域链的一部分。
如果两个嵌套函数均被全局引用,这两个函数共享同一个外围函数的调用对象,两个函数对此对象的修改,会影响另一个函数的调用对象(作用域链),当然如果只有一个被全局引用,在这个函数中执行另外一个,也是这种情况,相互影响。
 
JavaScript函数是将要执行的代码以及执行这些代码的作用域构成一个综合体。
 
当嵌套函数被导出到它所定义的作用域外时,以这种方法调用,叫做一个闭包。
 
 //闭包 ,嵌套函数被导出到它所定义的作用域外时,以这种方法调用,叫做一个闭包
function outA() {
var x = 0;
function inA() {
x += 1;
console.log("inA:x=" + x);
}
return inA;
}
var funa = outA();
funa();
funa(); function outC(obj) {
var x = 0;
function inA() {
x += 10;
console.log("inA:x=" + x);
}
function inB() {
x += 2;
console.log("inB:x=" + x);
}
obj.funa = inA;
obj.funb = inB;
}
var o = new Object();
outC(o);
o.funa();
o.funb();

输出:
"inA:x=1"
"inA:x=2"
"inA:x=10"
"inB:x=12"

 注:还差函数的使用与调用,就与Arguments合并
 

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

  1. 剖析JavaScript函数作用域与闭包

    在我们写代码写到一定阶段的时候,就会想深究一下js,javascript是一种弱类型的编程语言,而js中一个最为重要的概念就是执行环境,或者说作用域.作用域重要性体现在哪呢?首先,函数在执行时会创建作 ...

  2. JavaScript从作用域到闭包

    目录 作用域 全局作用域和局部作用域 块作用域与函数作用域 作用域中的声明提前 作用域链 函数声明与赋值 声明式函数.赋值式函数与匿名函数 代码块 自执行函数 闭包  作用域(scope) 全局作用域 ...

  3. 我认知的javascript之作用域和闭包

    说到javascript,就不得不说javascript的作用域和闭包:当然,还是那句老话,javascript在网上都说得很透彻了,我也就不过多的强调了: 作用域:javascript并没有像其他的 ...

  4. 浅谈JavaScript 函数作用域当中的“提升”现象

    在JavaScript当中,定义变量通过var操作符+变量名.但是不加 var 操作符,直接赋值也是可以的. 例如 : message = "hello JavaScript ! " ...

  5. JavaScript 函数作用域的“提升”现象

    在JavaScript当中,定义变量通过var操作符+变量名.但是不加 var 操作符,直接赋值也是可以的.例如 : message = "hello JavaScript ! " ...

  6. JavaScript函数表达式、闭包、模仿块级作用域、私有变量

    函数表达式是一种非常有用的技术,使用函数表达式可以无需对函数命名,从而实现动态编程.匿名函数,是一种强大的方式,一下总结了函数表达式的特点: 1.函数表达式不同于函数声明,函数声明要求有名字,但函数表 ...

  7. 深入理解javascript函数参数与闭包(一)

    在看此文章,希望先阅读关于函数基础内容 函数定义与函数作用域 的章节,因为这篇文章或多或少会涉及函数基础的内容,而基础内容,我放在函数定义函数作用域 章节. 本文直接赘述函数参数与闭包,若涉及相关知识 ...

  8. JavaScript之作用域与闭包详解

    前言: JavaScript是一种应用非常广泛的语言,其也有一些自身特点和优势,本文重在讲述其作用域机制以及闭包,会从一些实例来探讨其机理. 作用域在JavaScript程序员日常使用中有不同的含义, ...

  9. JavaScript的作用域和闭包

    首发于:https://mingjiezhang.github.io/ 闭包和作用域有着千丝万缕的联系. js的作用域 具体的作用域我就不展开叙述了.其中很重要的两点就是:js的作用域链机制和函数词法 ...

随机推荐

  1. DCI

    理论: 某个data,在一个特定的场景中,以某个角色role,来与该场景中的其他角色进行交互.这个过程要以代码的方式表达出来,他要求data本身不具备交互行为, 有交互行为的是角色,当一个data没有 ...

  2. uva10561 - Treblecross

    Treblecross is a two player game where the goal is to get three `X' in a row on a one-dimensional bo ...

  3. poj 3114 Countries in War

    http://poj.org/problem?id=3114 #include <cstdio> #include <cstring> #include <queue&g ...

  4. iso18092-2004中ISO14443,Felica的关系

    ISO18092协议介绍了P2P通讯中的ACTIVE模式和PASSIVE通讯模式,其实ISO18092使用了ISO14443协议和非国际标准的FELICA通讯协议,这里总结了一下.

  5. LeetCode题目答案索引

    LeetCode-Two Sum LeetCode-Median of Two Sorted Arrays LeetCode-Longest Substring Without Repeating C ...

  6. F - Count the Colors - zoj 1610(区间覆盖)

    有一块很长的画布,现在想在这块画布上画一些颜色,不过后面画的颜色会把前面画的颜色覆盖掉,现在想知道画完后这块画布的颜色分布,比如 1号颜色有几块,2号颜色有几块.... *************** ...

  7. java读XML文件

    XML文件设计为传输和存储数据,其焦点为数据内容. HTML设计为用来显示数据, 其焦点为数据外观. XML仅仅是文本文件,任何文本编辑器一般情况下都能对其进行编辑. XML没有预定义的标签,并且设定 ...

  8. <a>标签的href属性

    <a> 标签的 href 属性用于指定超链接目标的 URL. 语法 <a href="value"> 属性值 值 描述 URL 超链接的 URL.可能的值: ...

  9. AFNetworking (3.1.0) 源码解析 <五>

    这次主要开始讲解一下文件夹Serialization下的类AFURLRequestSerialization. AFURLRequestSerialization类遵守`AFURLRequestSer ...

  10. OpenSSL与公钥私钥证书签名的千丝万缕

    导语 人对任何事物的认识都是阶段性的,从无知到知晓,从懵懂到半知半解,从误解到将信将疑,从晕头转向到下定决心吃透. 介绍 OpenSSL是一个强大的命令行工具,它可以用来处理许多种跟PKI(Publi ...