浅谈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 相关文章推荐
Android中的jQuery:AQuery简介
May 06 Javascript
JS 使用for循环遍历子节点查找元素
Sep 06 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
Feb 03 Javascript
异步安全加载javascript文件的方法
Jul 21 Javascript
Javascript for in的缺陷总结
Feb 03 Javascript
React-Native使用Mobx实现购物车功能
Sep 14 Javascript
js实现单张图片平移切换效果
Oct 11 Javascript
JS实现倒序输出的几种常用方法示例
Apr 13 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
May 09 Javascript
微信小程序云开发如何使用云函数生成二维码
May 18 Javascript
如何实现小程序tab栏下划线动画效果
May 18 Javascript
一篇文章带你从零快速上手Rollup
Sep 07 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 Memcache 中实现消息队列
2009/11/24 PHP
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
PHP实现加密的几种方式介绍
2015/02/22 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
php使用file函数、fseek函数读取大文件效率对比分析
2016/11/04 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
PHP http请求超时问题解决方案
2020/11/13 PHP
EasySlider 基于jQuery功能强大简单易用的滑动门插件
2010/06/11 Javascript
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
基于jquery &amp; json的省市区联动代码
2012/06/26 Javascript
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
页面图片浮动左右滑动效果的简单实现案例
2014/02/10 Javascript
如何设置一定时间内只能发送一次请求
2014/02/28 Javascript
javascript实现rgb颜色转换成16进制格式
2015/07/10 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
2017/03/07 Javascript
react中fetch之cors跨域请求的实现方法
2018/03/14 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
2019/09/11 Javascript
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
javascript自定义加载loading效果
2020/09/15 Javascript
python实现红包裂变算法
2016/02/16 Python
python绘制多个曲线的折线图
2020/03/23 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
Python对ElasticSearch获取数据及操作
2019/04/24 Python
python中Lambda表达式详解
2019/11/20 Python
selenium 多窗口切换的实现(windows)
2020/01/18 Python
一款超酷的js+css3实现的3D标签云特效兼容ie7/8/9
2013/11/18 HTML / CSS
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
Marlies Dekkers内衣荷兰官方网店:荷兰奢侈内衣品牌
2020/03/27 全球购物
珍爱生命演讲稿
2014/05/10 职场文书
校运会口号
2014/06/18 职场文书
张丽莉事迹观后感
2015/06/16 职场文书
golang 如何通过反射创建新对象
2021/04/28 Golang
python学习之panda数据分析核心支持库
2021/05/07 Python