变量作用域&函数作用域
一. 变量作用域
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
thisvalue
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,documentorconsolein 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
argumentsobject 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默认可继承样式
前面的话 一直想总结出一份可继承样式的列表.常听说,颜色和字体是可继承的,盒模型样式是不可继承的,但其他样式呢?本文内容包括所有可继承的样式 [注意]关于样式的详细信息移步至此 常用可继承样式 col ...
- java中final注意的问题
public class Test{ public static void main(String[] args){ Person p = new Person(); } } /* 4.修饰的变量是一 ...
- 用DropDownList实现的省市级三级联动
这是一个用DropDownList 实现的省市级三级联动,记录一下········ <asp:ScriptManager ID="ScriptManager1" runat= ...
- ASProtect注册码使用教程|ASProtect SKE(加壳脱壳工具) 2.56 汉化注册版
ASProtect 是功能非常完善的加壳.加密保护工具.能够在对软件加壳的同时进行各种保护.如:反调试跟踪.自校验及用密钥加密保护等:还有多种限制使用措施,如:使用天数限制.次数限制及对应的注册提醒信 ...
- iOS_UIImge_Gif的展示
github地址: https://github.com/mancongiOS/UIImage.git 方式一: 用动画展示 UIImageView *gifImageView = [[UIImage ...
- 第一篇博文:PHP函数原型中的可选参数写法为什么这么写?
第一篇,算是开始吧.简单写点儿东西. 刚开始学PHP,在看PHP Manual时遇到一个问题:含可选参数的函数原型中,可选参数的写法看不懂. 例如explode函数 array explode ( s ...
- 六、GAIA
1. GAIA CSR GAIA (Generic Application Interface Architecture)提供了一个端到端的,与主机无关的生态系统来实现主机应用程序对设备的功 ...
- SqlCommandBuilder实现大数据更新
/// <param name="table">准备更新的DataTable新数据</param> /// <param name="Tab ...
- 【转】Validate + Boostrap tooltip 表单验证示例
一.工具准备: 1.boostrap: 下载地址 http://getbootstrap.com/ jquery: jQuery版本需大于或等于1.8.0 jquery.validate.min.j ...
- ASP.NET MVC显示HTML字符串
一些html经HtmlEncode后,如“<span>测试数据</span>”.现需要把这些内容正常显示于asp.net mvc的视图内. 举个例子来解决与说明,先创建一个mo ...