浅谈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 相关文章推荐
对YUI扩展的Gird组件 Part-1
Mar 10 Javascript
JS画线(实例代码)
Nov 20 Javascript
Jquery插件实现点击获取验证码后60秒内禁止重新获取
Mar 13 Javascript
详解jQuery移动页面开发中的ui-grid网格布局使用
Dec 03 Javascript
JS数组合并push与concat区别分析
Dec 17 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
Jun 20 Javascript
基于bootstrap实现广告轮播带图片和文字效果
Jul 22 Javascript
关于Javascript中document.cookie的使用
Mar 08 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
Aug 16 Javascript
微信小程序实现下载进度条的方法
Dec 08 Javascript
前端防止用户重复提交js实现代码示例
Sep 07 Javascript
使用Bootstrap做一个朝代历史表
Dec 10 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
dedecms后台验证码总提示错误的解决方法
2007/03/21 PHP
php写入txt乱码的解决方法
2019/09/17 PHP
JS随即打乱数组实现代码
2012/12/03 Javascript
JavaScript获取和设置CheckBox状态的简单方法
2013/07/05 Javascript
jquery如何实现锚点链接之间的平滑滚动
2013/12/02 Javascript
深入理解JSON数据源格式
2014/01/10 Javascript
jQuery 回车事件enter使用示例
2014/02/18 Javascript
js/jquery获取文本框输入焦点的方法
2014/03/04 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
JavaScript 判断一个对象{}是否为空对象的简单方法
2016/10/09 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
vue写一个组件
2018/04/09 Javascript
JavaScript实现学生在线做题计时器功能
2018/12/05 Javascript
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
Javascript ParentNode和ChildNode接口原理解析
2020/03/16 Javascript
Python文件右键找不到IDLE打开项解决办法
2015/06/08 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
python 设置文件编码格式的实现方法
2017/12/21 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
Python封装成可带参数的EXE安装包实例
2019/08/24 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
2020/02/15 Python
使用Python文件读写,自定义分隔符(custom delimiter)
2020/07/05 Python
HTML5拖拽API经典实例详解
2018/04/20 HTML / CSS
澳大利亚网上买书:Angus & Robertson
2019/07/21 全球购物
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
酒店管理毕业生自荐信
2013/10/24 职场文书
幼儿园毕业家长感言
2014/02/10 职场文书
2014年中秋节活动总结
2014/08/29 职场文书
优秀教师先进个人事迹材料
2014/08/31 职场文书
公司股东合作协议书
2014/09/14 职场文书
2015年社区国庆节活动总结
2015/07/30 职场文书
2016年社区文体活动总结
2016/04/06 职场文书
详解Mysql和Oracle之间的误区
2021/05/18 MySQL
python3 hdf5文件 遍历代码
2021/05/19 Python
一起来学习Python的元组和列表
2022/03/13 Python