浅谈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 相关文章推荐
用 Javascript 验证表单(form)中的单选(radio)值
Sep 08 Javascript
javascript+iframe 实现无刷新载入整页的代码
Mar 17 Javascript
Jquery each方法跳出循环,并获取返回值(实例讲解)
Dec 12 Javascript
js的Boolean对象初始值示例
Mar 04 Javascript
Windows 系统下安装和部署Egret的开发环境
Jul 31 Javascript
js实现飞入星星特效代码
Oct 17 Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
Aug 31 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
Oct 14 Javascript
教你一步步用jQyery实现轮播器
Dec 18 Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
Aug 16 Javascript
js+canvas实现两张图片合并成一张图片的方法
Nov 01 Javascript
如何实现iframe父子传参通信
Feb 05 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
Get或Post提交值的非法数据处理
2006/10/09 PHP
回答PHPCHINA上的几个问题:URL映射
2007/02/14 PHP
php笔记之常用文件操作
2010/10/12 PHP
PHP排序算法的复习和总结
2012/02/15 PHP
PHP 过滤页面中的BOM(实现代码)
2013/06/29 PHP
php 根据url自动生成缩略图并处理高并发问题
2014/01/23 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
2017/07/03 PHP
Laravel框架实现的使用smtp发送邮件功能示例
2019/03/12 PHP
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
容易造成JavaScript内存泄露几个方面
2014/09/04 Javascript
深入理解javascript原型链和继承
2014/09/23 Javascript
jQuery插件uploadify实现ajax效果的图片上传
2016/06/18 Javascript
AngularJS执行流程详解
2017/02/17 Javascript
angularJS之$http:与服务器交互示例
2017/03/17 Javascript
js数组实现权重概率分配
2017/09/12 Javascript
JS交互点击WKWebView中的图片实现预览效果
2018/01/05 Javascript
LayUI表格批量删除方法
2018/08/15 Javascript
JS获取今天是本月第几周、本月共几周、本月有多少天、是今年的第几周、是今年的第几天的示例代码
2018/12/05 Javascript
JS制作简易计算器的实例代码
2020/07/04 Javascript
Python单链表的简单实现方法
2014/09/23 Python
Python字符串处理之count()方法的使用
2015/05/18 Python
python实现决策树
2017/12/21 Python
Python 读取某个目录下所有的文件实例
2018/06/23 Python
使用 Python 处理 JSON 格式的数据
2019/07/22 Python
pygame库实现俄罗斯方块小游戏
2019/10/29 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
CSS3的resize属性使用初探
2015/09/27 HTML / CSS
美国购买体育、音乐会和剧院门票网站:SelectATicket
2019/09/08 全球购物
服务质量承诺书
2014/03/27 职场文书
葬礼司仪主持词
2014/03/31 职场文书
简单通用的简历自我评价
2014/09/21 职场文书
小学教育见习报告
2014/10/31 职场文书
离婚协议书怎么写的
2014/12/14 职场文书
七个Python必备的GUI库
2021/04/27 Python
特别篇动画《总之就是非常可爱 ~制服~》PV公开,2022年夏季播出
2022/04/04 日漫
SpringCloud项目如何解决log4j2漏洞
2022/04/10 Java/Android