浅谈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 相关文章推荐
Display SQL Server Login Mode
Jun 21 Javascript
javaScript 关闭浏览器 (不弹出提示框)
Jan 31 Javascript
判断客户端浏览器是否安装了Flash插件的多种方法
Aug 11 Javascript
JavaScript游戏之是男人就下100层代码打包
Nov 08 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
Jun 16 Javascript
学习JavaScript设计模式之中介者模式
Jan 14 Javascript
Jquery Easyui表单组件Form使用详解(30)
Dec 19 Javascript
js实现加载页面就自动触发超链接的示例
Aug 31 Javascript
vue中的自定义分页插件组件的示例
Aug 18 Javascript
解决layui动态添加的元素click等事件触发不了的问题
Sep 20 Javascript
JavaScript实现网页下拉菜单效果
Nov 20 Javascript
关于对TypeScript泛型参数的默认值理解
Jul 15 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同时支持GIF、png、JPEG
2006/10/09 PHP
从php核心代码分析require和include的区别
2011/01/02 PHP
php出现内存位置访问无效错误问题解决方法
2014/08/16 PHP
PHP实现搜索地理位置及计算两点地理位置间距离的实例
2016/01/08 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
laravel admin实现分类树/模型树的示例代码
2020/06/10 PHP
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
JS 获取浏览器和屏幕宽高等信息代码
2014/03/31 Javascript
JS实现弹性漂浮效果的广告代码
2015/09/02 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
2015/11/09 Javascript
jquery实现图片预加载
2015/12/25 Javascript
VueJs组件prop验证简单介绍
2017/09/12 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
js脚本中执行java后台代码方法解析
2019/10/11 Javascript
JavaScript实现PC端四格密码输入框功能
2020/02/19 Javascript
vant picker+popup 自定义三级联动案例
2020/11/04 Javascript
[01:00:52]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第一场
2018/04/05 DOTA
python全栈要学什么 python全栈学习路线
2019/06/28 Python
python中property属性的介绍及其应用详解
2019/08/29 Python
Pytorch 神经网络—自定义数据集上实现教程
2020/01/07 Python
python的reverse函数翻转结果为None的问题
2020/05/11 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
详解BeautifulSoup获取特定标签下内容的方法
2020/12/07 Python
西班牙灯具网上商店:Lampara.es
2018/06/05 全球购物
《蒲公英》教学反思
2014/02/28 职场文书
读群众路线心得体会
2014/03/07 职场文书
大学生学雷锋活动总结
2014/06/26 职场文书
平遥古城导游词
2015/02/03 职场文书
驳回起诉裁定书
2015/05/19 职场文书
python 算法题——快乐数的多种解法
2021/05/27 Python
微信小程序 根据不同用户切换不同TabBar
2022/04/21 Javascript
Java 异步任务计算FutureTask
2022/04/28 Java/Android
纯CSS打字动画的实现示例
2022/08/05 HTML / CSS