浅谈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 多行滚动代码(附详细解释)
Jun 17 Javascript
javascript 动态创建表格
Jan 08 Javascript
jQuery跨域问题解决方案
Aug 03 Javascript
js简单网速测试方法完整实例
Dec 15 Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
Jun 09 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
Mar 06 Javascript
使用vue框架 Ajax获取数据列表并用BootStrap显示出来
Apr 24 Javascript
详解React 16 中的异常处理
Jul 28 Javascript
JS 中document.write()的用法和清空的原因浅析
Dec 04 Javascript
node.js环境搭建图文详解
Sep 19 Javascript
Smartour 让网页导览变得更简单(推荐)
Jul 19 Javascript
vue使用过滤器格式化日期
Jan 20 Vue.js
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开发中的安全防范知识详解
2013/06/06 PHP
PHP实现的简单日历类
2014/11/29 PHP
smarty学习笔记之常见代码段用法总结
2016/03/19 PHP
Yii统计不同类型邮箱数量的方法
2016/10/18 PHP
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
node.js中的fs.chownSync方法使用说明
2014/12/16 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
JavaScript显示表单内元素数量的方法
2015/04/02 Javascript
ECMAScript中函数function类型
2015/06/03 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
2016/02/26 Javascript
jQuery用FormData实现文件上传的方法
2016/11/21 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
jQuery EasyUI Draggable拖动组件
2017/03/01 Javascript
Vue自定义指令使用方法详解
2017/08/21 Javascript
Bootstrap栅格系统的使用详解
2017/10/30 Javascript
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
JS与jQuery判断文本框还剩多少字符可以输入的方法
2018/09/01 jQuery
js实现搜索栏效果
2018/11/16 Javascript
javascript实现计算指定范围内的质数示例
2018/12/29 Javascript
javascrit中undefined和null的区别详解
2019/04/07 Javascript
JavaScript多种滤镜算法实现代码实例
2019/12/10 Javascript
使用typescript改造koa开发框架的实现
2020/02/04 Javascript
小程序实现简单语音聊天的示例代码
2020/07/24 Javascript
js实现简单的点名器随机色实例代码
2020/09/20 Javascript
python连接MySQL数据库实例分析
2015/05/12 Python
pyqt5自定义信号实例解析
2018/01/31 Python
Keras 加载已经训练好的模型进行预测操作
2020/06/17 Python
薇诺娜官方网上商城:专注敏感肌肤
2017/05/25 全球购物
美国床垫和床上用品公司:Nest Bedding
2017/06/12 全球购物
希腊香水和化妆品购物网站:Parfimo.gr
2019/10/03 全球购物
英国性能汽车零件和发动机配件在线:Maxpeedingrods
2019/11/05 全球购物
学校十一活动方案
2014/02/01 职场文书
党的群众路线教育实践活动心得体会900字
2014/03/07 职场文书
班主任寄语大全
2014/04/04 职场文书
2015元旦主持词开场白和结束语
2014/12/14 职场文书
大学生安全教育心得体会
2016/01/15 职场文书