浅谈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 相关文章推荐
脚本吧 - 幻宇工作室用到js,超强推荐share.js
Dec 23 Javascript
IE浏览器PNG图片透明效果代码
Sep 02 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
Mar 24 Javascript
解决JS请求服务器gbk文件乱码的问题
Oct 16 Javascript
JavaScript中两个字符串的匹配
Jun 08 Javascript
简单谈谈JS数组中的indexOf方法
Oct 13 Javascript
React Component存在的几种形式详解
Nov 06 Javascript
webpack自动打包和热更新的实现方法
Jun 24 Javascript
Angular进行简单单元测试的实现方法实例
Aug 16 Javascript
vue使用Sass时报错问题的解决方法
Oct 14 Javascript
vuejs实现下拉框菜单选择
Oct 23 Javascript
一文彻底理解js原生语法prototype,__proto__和constructor
Oct 24 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调用Webservice实例代码
2011/07/29 PHP
php之CodeIgniter学习笔记
2013/06/17 PHP
php实现简单洗牌算法
2013/06/18 PHP
php中HTTP_REFERER函数用法实例
2014/11/21 PHP
PHP访问Google Search API的方法
2015/03/05 PHP
yii2局部关闭(开启)csrf的验证的实例代码
2017/07/10 PHP
IE8下Jquery获取select选中的值post到后台报错问题
2014/07/02 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
JavaScript sub方法入门实例(把字符串显示为下标)
2014/10/17 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
2015/03/11 Javascript
xmlplus组件设计系列之树(Tree)(9)
2017/05/02 Javascript
利用JS制作万年历的方法
2017/08/16 Javascript
JS中关于正则的巧妙操作
2017/08/31 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
vuex与组件联合使用的方法
2018/05/10 Javascript
layUI实现三级导航菜单效果
2019/07/26 Javascript
js实现多张图片每隔一秒切换一张图片
2019/07/29 Javascript
js实现验证码干扰(动态)
2021/02/23 Javascript
[45:40]Ti4 冒泡赛第二天NEWBEE vs NaVi 1
2014/07/15 DOTA
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
在Django同1个页面中的多表单处理详解
2017/01/25 Python
python opencv实现旋转矩形框裁减功能
2018/07/25 Python
python使用pdfminer解析pdf文件的方法示例
2018/12/20 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
Python标准库itertools的使用方法
2020/01/17 Python
Python Numpy 控制台完全输出ndarray的实现
2020/02/19 Python
西铁城美国官方网站:Citizen Watch美国
2019/11/08 全球购物
审核会计岗位职责
2013/11/08 职场文书
我的五年职业生涯规划
2014/01/23 职场文书
兰兰过桥教学反思
2014/02/08 职场文书
服装发布会策划方案
2014/05/22 职场文书
乔布斯斯坦福大学演讲稿
2014/05/23 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
2015年世界卫生日活动总结
2015/02/09 职场文书
2019各种承诺书范文
2019/06/24 职场文书