变量作用域&函数作用域
一. 变量作用域
1)全局变量
在全局环境下声明的变量被视为全局变量。
在没有使用var进行声明的时候,变量就被定义为全局变量。在ES5的严格模式下,如果变量没有使用var来声明是会报错的。
2)局部变量
在函数体内部声明的变量被视为局部变量。其中涉及到js中的函数作用域问题。
二. 函数作用域
因为js中是没有块级作用域的概念,所谓的块级作用域就是指花括号内的的每一段代码都有其自己的作用域,但js中并不是,例如for循环中定义的变量,外界也可以访问;但是js中有函数作用域的概念,即在每一个函数体内,变量是有其自己的作用域的,外界访问不到;
三. 变量提升
js在编译阶段有个特性,就是变量提升。当js引擎在解析代码的时候,会将变量声明提升至其函数体的顶部。有关资料可参考
http://www.slideshare.net/lijing00333/javascript-engine
借用ppt里的例子:
a();
function a () {
alert('Tom');
}
var a = function () {
alert('Jim');
} a();
执行时会先弹出Tom,再弹出Jim。具体的过程是,js是解释型语言,因此当浏览器运行js时会分为两个部分,首先预编译全部代码,之后执行代码。
下面的例子:
a();
function a () {
alert('1');
}
a();
function a () {
alert('2');
}
a();
var a = function () {
alert('3');
}
a();
此处同理,会弹出2,2,2,3,只不过在编译阶段,后面的函数a声明覆盖了前面的声明,因此在执行a的阶段弹出2。最后的3是因为在此函数被调用前对它进行了赋值操作,覆盖了前面的函数声明。
四. 函数解析
(这个地方我理解的也不是特别透彻,仅此拙见,望指正)
1)Execution context(执行上下文)
每个函数或者全局代码都会产生一个执行上下文,并在其中运行,而执行上下文的形式是一个object。其中包含
Execution context is an object which consists of:
- variable object, which is activation object in case of functions
- scope chain, which you can think of as a linked list of outer scopes
this
value
2)变量对象
每个执行上下文都包含一个变量对象,这个变量对象是用来存储执行环境中的变量和函数声明,但不同的情况下,包含的数据不同。
Variable object is an abstract thing, which can be either one of those:
- global object (in global context) - the place where global vars (like
window
,document
orconsole
in a browser) reside - activation object (for functions, which define scopes in ECMAScript)
函数表达式不包含在变量对象中
3)活动对象
当进入函数执行环境时,会产生一个活动对象(activation object)[在作用域链最前端的对象],包含了形参,arguments对象。它作为执行环境的变量对象,除了函数声明和变量名称还增加了形参和arguments对象。
Activation object is an object which holds:
- formal args of the function
arguments
object for this function- any vars and (named) functions inside this function
So, activation object is just a special case of variable object.
It is basically a container for all the local stuff you can access by name inside a function, except for this
.
针对于foo函数,它的活动对象包含下面的内容。
4)作用域链
在每个执行上下文中都会包含一个作用域链,用以存储函数作用域内的变量和函数声明和父级变量。当解析一个标识符(函数,形参,变量)的时候会从作用域链的变量对象开始查找,一级一级向上查找,类似于原型链的概念。
参考:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/
变量作用域&函数作用域的更多相关文章
- js12--块作用域函数作用域
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- c语言中变量和函数作用域深究
首先,函数的作用域和访问权限基本可以参考 C语言中的作用域,链接属性和存储类型 也存在例外情况,比如内联函数 static inline,使用static 修饰 inline之后外部文件也可以访问内联 ...
- 洗礼灵魂,修炼python(22)--自定义函数(3)—函数作用域,闭包
前面你看到嵌套两层的函数,也许你有感而发,想来点刺激的对不?那么如果每层内的变量名如果相同会怎样?拿个例子看下就知道: 报错了,报错信息大意是,本地变量‘num’引用前没有被赋值定义.这咋回事,我外层 ...
- 你不知道的Javascript(上卷)读书笔记之三 ---- 函数作用域与块作用域
1. 函数中的作用域 函数作用域的含义是指属于这个函数的全部变量都可以在整个函数范围内使用以及复用 2. 隐藏内部实现 函数经常使用于隐藏”内部实现”,可以把变量和函数包裹在一个函数的作用域中,然后用 ...
- JS变量提升和作用域
一.JS变量提升 1.当浏览器引擎解析js代码时,将js中的所有一开始就是var声明的和function声明的都提升到全局.此时又叫全局作用域 console.log(aa); console.log ...
- 了解 JS 作用域与作用域链
(1)作用域 一个变量的作用域(scope)是程序源代码中定义的这个变量的区域. 1. 在JS中使用的是词法作用域(lexical scope) 不在任何函数内声明的变量(函数内省略var的也算全局) ...
- js 碎片整理(变量声明,函数作用域)
1.变量声明: 在非严格模式下,函数可以对未声明的变量赋值,而这样赋值的结果就是该变量就会变成全局变量. (function(){ var a = 1; })(); console.log(a) ; ...
- JavaScript(1)——变量、函数声明及作用域
这是我的第一篇博客文章,本人不才,文笔也不好,所以可能写的有点凌乱.有什么不对的地方还望见谅.不过每天进步一小步,总有一天会迈出那一大步.以下内容是我对变量.函数声明及函数表达式.作用域的理解. [变 ...
- JS 函数作用域及变量提升那些事!
虽然看了多次js函数作用域及变量提升的理论知识,但小编也是一知半解~ 这几天做了几道js小题,对这部分进行了从新的理解,还是有所收获的~ 主要参考书籍: <你不知道的JavaScript(上卷) ...
随机推荐
- 深入理解CSS背景
前面的话 背景和字体一样,是一个复合属性,而且它是一个使用频率很高的属性.在CSS3中,背景属性在保持以前用法的同时,增加了新的相关属性.本文将详细介绍关于背景的知识 背景颜色 背景色backgrou ...
- Redis应用场景-转载
1. MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的 ...
- .NET应用服务器
昨天参加Oracle的一个活动,知道了WebLogic的强大,于是对应用服务器产生了兴趣. WebLogic是一个Java EE应用服务器(与Java EE对应的另外一个技术平台就是.NET). 为什 ...
- Spark入门实战系列--4.Spark运行架构
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1. Spark运行架构 1.1 术语定义 lApplication:Spark Appli ...
- js每天进步一点点3
JS之样式的改变
- redis学习之二from github
大概敲了一遍基本命令,熟悉了redis的存储方式.现在开始进一步系统的学习.学习教程目前计划有三个,一个是github上的https://github.com/JasonLai256/the-litt ...
- GitHub一代:我们都是开源控
我们是新的GitHub一代?GitHub塑造了新式开源文化?嗯,看看十几年开源控.Getable CTO Mikeal Rogers 是怎么说的吧: GitHub本来想做一个开源软件协作平台,结果做着 ...
- Winform应用程序实现通用遮罩层
在WEB上,我们在需要进行大数据或复杂逻辑处理时,由于耗时较长,一般我们会在处理过程中的页面上显示一个半透明的遮罩层,上面放个图标或提示:正在处理中...等字样,这样用户体验就比较好了,然而如果在Wi ...
- ES6笔记(2)-- let的块级作用域
系列文章 -- ES6笔记系列 一.函数级作用域 我们都知道,在ES6以前,JS只有函数级作用域,没有块级作用域这个概念 没有块级作用域,有利有弊,利于方便自由,弊于作用域内的变量容易被共享,例如这个 ...
- Python性能提升小技巧
第一部分 1-使用内建函数: 你可以用Python写出高效的代码,但很难击败内建函数. 经查证. 他们非常快速 2-使用 join() 连接字符串. 你可以使用 + 来连接字符串. 但由于string ...