浅谈javascript中的作用域


Posted in Javascript onApril 07, 2012

JS中作用域的概念:

表示变量或函数起作用的区域,指代了它们在什么样的上下文中执行,亦即上下文执行环境。Javascript的作用域只有两种:全局作用域和本地作用域,本地作用域是按照函数来区分的。

首先来看几道题目:

1.

if(true){ 
var aa= "bb"; 
} 
console.log(aa); //bb for(var i = 0; i < 100; i++){ 
//do 
} 
console.log(i); //100

2.
var bb = '11111'; 
function aa() { 
alert(bb);//undefine 
var bb = 'test'; 
alert(bb);//test 
 var cc = "test1"; 
alert(age);//语法错误 
} 
aa();

3.
var test = '1111111'; 
function aa() { 
alert(test); 
} function bb() { 
var test = '22222222'; 
aa(); 
} 
bb();//alert(1111111);

4.
alert(typeof aa); //function 
alert(typeof bb); //undefined function aa() { //函数定义式 
alert('I am 111111111'); 
}; 
var bb = function() { //函数表达式 
} 
alert(typeof bb);//function

5.
function aa(){ 
var bb = "test"; 
cc = "测试"; 
alert(bb); 
} 
aa(); 
alert(cc);//测试 
alert(bb);//语法报错

上面这5道题目全部概括了js中作用域的问题

可以总结出这么几个观点

一、无块级作用域

从第一题中可以看出来,在{}中执行后,变量并没有被销毁,还是保存在内存中的,因此我们可以访问到的。

二、JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里.

这里提到函数的作用域链这个概念,在ECMA262中,是这样的

任何执行上下文时刻的作用域, 都是由作用域链(scope chain)来实现.
在一个函数被定义的时候, 会将它定义时候的scope chain链接到这个函数对象的[[scope]]属性.
在一个函数对象被调用的时候,会创建一个活动对象(也就是一个对象), 然后对于每一个函数的形参,都命名为该活动对象的命名属性, 然后将这个活动对象做为此时的作用域链(scope chain)最前端, 并将这个函数对象的[[scope]]加入到scope chain中.
所以题目3 结果是alert(1111111);

三、JS会提前处理function定义式 和var关键字

如题目4 开始alert(bb); //undefine ,alert(age)//语法报错,这两个有什么区别呢,原因就是后面有var bb =“test”,在初始化的时候提前处理了var 这个关键字,只是这个开始未赋值

将代码修改成这样的,可以看出来

var dd = '11111'; 
function aa() { 
alert(bb);//undefine 
 var bb = 'test'; 
alert(bb);//test 

 var cc = "test1"; 
alert(age);//语法错误 
} 
aa(); 
alert(dd);//11111 
alert(cc);//语法报错

此处alert(bb)没有报语法错误,alert(age)报语法错误。

但是请注意:

<script> 
alert(typeof aa); //结果:undefined 
</script> 
<script> 
function aa() { 
alert('yupeng'); 
} 
</script>

这说明js预编译是以段为单元的。题目4同理

四、函数级作用域

函数里面的定义的变量,在函数执行完后就销毁了,不占有内存区域了。

所以题目2最后的alert(cc);语法报错,题目5最后到 alert(bb)同理

Javascript 相关文章推荐
jQuery与ExtJS之选择实例分析
Aug 19 Javascript
基于jquery的可多选的下拉列表框
Jul 20 Javascript
jQuery中大家不太了解的几个方法
Mar 04 Javascript
基于vue2.0+vuex的日期选择组件功能实现
Mar 13 Javascript
js a标签点击事件
Mar 30 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
Jul 17 Javascript
JS实现非首屏图片延迟加载的示例
Jan 06 Javascript
React 使用browserHistory项目访问404问题解决
Jun 01 Javascript
vue.js 实现输入框动态添加功能
Jun 25 Javascript
vue根据值给予不同class的实例
Sep 29 Javascript
使用vue-cli webpack 快速搭建项目的代码
Nov 21 Javascript
Bootstrap FileInput实现图片上传功能
Jan 28 Javascript
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
Apr 07 #Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
Apr 07 #Javascript
JavaScript 高级篇之函数 (四)
Apr 07 #Javascript
JavaScript 基础篇之对象、数组使用介绍(三)
Apr 07 #Javascript
JavaScript 基础篇之运算符、语句(二)
Apr 07 #Javascript
为原生js Array增加each方法
Apr 07 #Javascript
jquery 操作DOM案例代码分享
Apr 05 #Javascript
You might like
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
2014/05/06 PHP
php获取用户浏览器版本的方法
2015/01/03 PHP
php+mysql实现用户注册登陆的方法
2015/01/03 PHP
Yii获取当前url和域名的方法
2015/06/08 PHP
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
2010/05/04 Javascript
每天一篇javascript学习小结(Date对象)
2015/11/13 Javascript
javascript中select下拉框的用法总结
2016/01/07 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
2017/12/27 Javascript
vue2.0模拟锚点的实例
2018/03/14 Javascript
重新认识vue之事件阻止冒泡的实现
2018/08/02 Javascript
vue 通过绑定事件获取当前行的id操作
2020/07/27 Javascript
Python的Flask框架的简介和安装方法
2015/11/13 Python
Python3.2模拟实现webqq登录
2016/02/15 Python
数据清洗--DataFrame中的空值处理方法
2018/07/03 Python
python格式化输出保留2位小数的实现方法
2019/07/02 Python
python获取当前文件路径以及父文件路径的方法
2019/07/10 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
2019/12/12 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
Python 如何查找特定类型文件
2020/08/17 Python
python的dict判断key是否存在的方法
2020/12/09 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
HTML5 Canvas绘制文本及图片的基础教程
2016/03/14 HTML / CSS
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
2012/09/06 面试题
翻译专业应届生求职信
2013/11/23 职场文书
升职自荐信
2013/11/28 职场文书
验房委托书
2014/08/30 职场文书
大学生党员批评与自我批评范文
2014/10/14 职场文书
基层工作经验证明样本
2014/11/16 职场文书
2014年扫黄打非工作总结
2014/12/03 职场文书
工作感想范文
2015/08/07 职场文书
2019最新版股权转让及委托持股协议书范本
2019/08/07 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python
解析Java异步之call future
2021/06/14 Java/Android
Python IO文件管理的具体使用
2022/03/20 Python