JavaScript中的作用域 、作用域链和闭包

JavaScript中作用,作用域链和闭包详解

一、作用域
在js中有全局变量和局部变量之分:
比如
var a = 1;
function sum(){
var b=1
console.log(b) //1
console.log(a) //2

}
sum()
console.log(a) //3
console.log(b) //4

例子中 a 是全局变量,b是局部变量(定义在函数内部,只能在函数内部访问)所以第1行正确
函数内部也能访问全局变量 a所以第2行也能正确 第三行也正确。第4行有外部不能访问
内部变量。变量声明的时候初始化,局部变量在函数调用完时候销毁,全局变量在页面关闭时候销毁
(注意如何b没有用var修饰,就默认是全局变量)

二、js函数

1、function 函数名(){
}
2、匿名函数 function(){}
3、立即执行函数又名表达式函数
(function(i){
//dosometing
})(i)

4、私有函数
function a(){
function b(){ ====私有函数

  }

}

5、var 发=new Function(//dosomething)
6、变量的提升 函数提升

函数的生命周期
1、在函数创建阶段,JS解析引擎进行预解析,会将函数声明提前,同时将该函数放到全局作用域中(js中函数是一等公民优先考虑)或当前函数的上一级函数的局部作用域中。
在函数

执行阶段,会创建该函数的执行上下文并且JS引擎会将当前函数的局部变量和内部函数进行声明提前,然后再执行业务代码,当函数执行完退出时,释放该函数的执行上下文,并注销该函数

的局部变量。

2、函数声明大于变量声明()

三、作用域链

1、在JS中运行中 当某个函数第一次被调用时 ,就会创建一个执行环境(execution context)以及相应的作用域链在js中将声明的变量、参数、私有函数封装在一个结构体内 ,对外界来

说不可见的 并把作用域链赋值给一个特殊的内部属性([scope])。然后使用this.arguments(arguments在全局环境中不存在)和其他命名参数的值来初始化函数的活动对象(activation

object)。当前执行环境的变量对象始终在作用域链的第0位

 例子

function a(){
var a;
function b(){
return a

}
return b

}
var fun=a()
fun()

 在JS运行上面机制  a函数作用链(scope chain )  b作用域链(b是内部函数)[scope chain]   会生成执行上下文变量  当代码在一个环境中执行时,会创建变量对象的一个作用域

链。作用域链的用途是保证对执行环境(执行上下文)有权访问的所有变量和函数的有序访问。

变量对象(VO):变量对象即包含变量的对象,变量对象我们无法访问,除此之外和普通对象没什么区别。变量对象存储了在上下文中定义的变量和函数声明

活动对象(AO):是在进入函数执行

        环境时刻被创建的,它通过函数的 arguments 属性初始化。

变量对象和活动对象的关系

未进入执行阶段之前,变量对象(VO)中的属性都不能访问,只是声明但是进入执行阶段

      之后,变量对象(VO)转变为了

活动对象(AO),里面的属性都能被访问了,然后开始进行执行阶段的操作。它们其实都是同一个对象,只是处于执行环境的不同生命周期。AO 实际上是包含了 VO 的。因为除了 VO 之外,AO

还包含函数的 parameters,以及?arguments?这个特殊对象。也就是说 AO 的确是在进入到执行阶段的时候被激活,但是激活的除了 VO 之外,还包括函数执行时传入的参数
和?arguments?这个特殊对象。

四、 JavaScript闭包

  在js私有函数对外部函数产生引用或者变量依赖就会产生闭包 通俗的讲函数是可以嵌套函数的,内部function可以访问外部function的变量;通过引用访问函数内的函数,实现内存的

保留;访问函数内的函数,突破变量作用域限制

 var a=function(){
   var a的变量
      function b(){
          a++;
      }
      return b

}
var s=a()

 1、信息保留就是引用存在,空间不会因为函数(内部函数)销毁,而消失,

??
c.add1();

原文地址:https://blog.51cto.com/14582569/2476271

时间: 2024-07-29 05:59:36

JavaScript中的作用域 、作用域链和闭包的相关文章

javaScript中的this作用域

javaScript中的this作用域java的区别是,java中的this是在编译中确定, javaScript中的this是在运行时确定的,不同的调用方式,决定js中的this指向不同的对象. 代码实现: //this作用域 function sayName(){ console.log(this.name); console.log(this ===d1); console.log(this ===d2); console.log(this ===window); } sayName();

【译】学习JavaScript中提升、作用域、闭包的终极指南

这似乎令人惊讶,但在我看来,理解JavaScript语言最重要和最基本的概念是理解执行上下文.通过正确学习它,你将很好地学习更多高级主题,如提升,作用域链和闭包.考虑到这一点,究竟什么是"执行上下文"?为了更好地理解它,我们首先来看看我们如何编写软件. 编写软件的一种策略是将代码分解为单独的部分.虽然这些"部分"有许多不同的名称(功能,模块,包等),但它们都是为了一个目的而存在 - 分解和管理应用程序的复杂性.现在,不要像编写代码的人那样思考,而是根据JavaScr

JavaScript中变量、作用域和内存问题(JavaScript高级程序设计第4章)

一.变量 (1)ECMAScript变量肯能包含两种不同的数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段,引用类型值指那些可能由多个值构成的对象. (2)基本数据类型是按值访问,可以操作保存在变量中的实际的值:引用类型的值是保存在内存中对象,操作对象时,实际上是在操作对象的引用而不是实际的对象,引用类型的值是按引用访问的. (3)传递参数.ECMScript中所有的函数的参数都是按值传递的. function setName(obj){ obj.name = "Nichola

JavaScript 中变量、作用域和内存问题的学习

这是我学习JavaScript的第二篇文章,之前做过几年的Java开发,发现JavaScript虽然也是面向对象的语言但是确实有很多不同之处.就本篇博客,主要学习总结一下最近学习到的JavaScript的知识,其中有些是网络上的,不过对于理解JavaScript,和在工作总是会很实用的,所以总结了下来: 那么就开始吧,首先是变量 在JavaScript中变量分为两种:一种是基本类型,基本类型值在内存中占用固定大小的空间,因此被保存在栈内存中.从一个变量向另一个变量复制基本类型的值,会创建这个值的

作用域、原型链、闭包等概念理解

1.执行环境及作用域 (1).执行环境: 定义了变量或函数有权访问的其它数据,决定了它们的各自行为.每个执行环境都有一个与之关联的变量对象(variable object, VO),执行环境中定义的所有变量和函数都会保存在这个对象中,解析器在处理数据的时候就会访问这个内部对象. 全局执行环境是最外层的一个执行环境,在web浏览器中全局执行环境是window对象,因此所有全局变量和函数都是作为window对象的属性和方法创建的.每个函数都有自己的执行环境,当执行流进入一个函数的时候,函数的环境会被

JS详细图解作用域链与闭包

JS详细图解作用域链与闭包 攻克闭包难题 初学JavaScript的时候,我在学习闭包上,走了很多弯路.而这次重新回过头来对基础知识进行梳理,要讲清楚闭包,也是一个非常大的挑战. 闭包有多重要?如果你是初入前端的朋友,我没有办法直观的告诉你闭包在实际开发中的无处不在,但是我可以告诉你,前端面试,必问闭包.面试官们常常用对闭包的了解程度来判定面试者的基础水平,保守估计,10个前端面试者,至少5个都死在闭包上. 可是为什么,闭包如此重要,还是有那么多人没有搞清楚呢?是因为大家不愿意学习吗?还真不是,

javascript中的立即执行函数(function(){…})()

javascript中的立即执行函数(function(){…})() 深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是用(function(){…})()包住业务代码,使用jquery时比较常见. ( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函数定义后立即执行的目的,后来发现加括号的原因并非如此.要

【转】深入浅出 JavaScript 中的 this

Java 等面向对象的语言中,this 关键字的含义是明确且具体的,即指代当前对象.一般在编译期确定下来,或称为编译期绑定.而在 JavaScript 中,this 是动态绑定,或称为运行期绑定的,这就导致 JavaScript 中的 this 关键字有能力具备多重含义,带来灵活性的同时,也为初学者带来不少困惑.本文仅就这一问题展开讨论,阅罢本文,读者若能正确回答 JavaScript 中的 What ’s this 问题,作为作者,我就会觉得花费这么多功夫,撰写这样一篇文章是值得的. Java

深入浅出 JavaScript 中的 this

本文来自:http://www.ibm.com/developerworks/cn/web/1207_wangqf_jsthis/ JavaScript 语言中的 this 由于其运行期绑定的特性,JavaScript 中的 this 含义要丰富得多,它可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式.JavaScript 中函数的调用有以下几种方式:作为对象方法调用,作为函数调用,作为构造函数调用,和使用 apply 或 call 调用.下面我们将按照调用方式的不同,分别讨论