浅谈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 CSS菜单功能 改进版
Dec 20 Javascript
&amp;lt;script defer&amp;gt; defer 是什么意思
May 10 Javascript
js页面跳转常用的几种方式
Nov 25 Javascript
jquery获取一组checkbox的值(实例代码)
Nov 04 Javascript
jquery实现ajax提交form表单的方法总结
Mar 03 Javascript
JavaScript如何自定义trim方法
Jul 28 Javascript
javascript获取select标签选中的值
Jun 04 Javascript
jQuery的extend方法【三种】
Dec 14 Javascript
node简单实现一个更改头像功能的示例
Dec 29 Javascript
webpack中使用iconfont字体图标的方法
Feb 22 Javascript
Vue中keep-alive 实现后退不刷新并保持滚动位置
Mar 17 Javascript
jQuery实现简单飞机大战
Jul 05 jQuery
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
风格模板初级不完全修改教程
2006/10/09 PHP
php实现的Captcha验证码类实例
2014/09/22 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
2016/01/07 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
Opacity.js
2007/01/22 Javascript
Javascript面向对象扩展库代码分享
2012/03/27 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
jquery和js实现对div的隐藏和显示方法
2014/09/26 Javascript
jquery实现的美女拼图游戏实例
2015/05/04 Javascript
jQuery ui实现动感的圆角渐变网站导航菜单效果代码
2015/08/26 Javascript
js+html5操作sqlite数据库的方法
2016/02/02 Javascript
JavaScript遍历求解数独问题的主要思路小结
2016/06/12 Javascript
值得分享的JavaScript实现图片轮播组件
2016/11/21 Javascript
小程序视频列表中视频的播放与停止的示例代码
2018/07/20 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
2018/12/11 jQuery
javascript实现点击星星小游戏
2019/12/24 Javascript
小程序跨页面交互的作用与方法详解
2020/01/07 Javascript
vue实现前端分页完整代码
2020/06/17 Javascript
微信小程序实现电子签名功能
2020/07/29 Javascript
Python字符串详细介绍
2015/05/09 Python
Python检测一个对象是否为字符串类的方法
2015/05/21 Python
在Python中使用zlib模块进行数据压缩的教程
2015/06/26 Python
Python自定义主从分布式架构实例分析
2016/09/19 Python
python读取ini配置的类封装代码实例
2020/01/08 Python
python 爬虫请求模块requests详解
2020/12/04 Python
加拿大最大的书店:Indigo
2017/01/01 全球购物
为数据库创建索引都需要注意些什么
2012/07/17 面试题
工作失职检讨书
2015/01/26 职场文书
长江三峡导游词
2015/01/31 职场文书
2015个人年度工作总结范文
2015/05/28 职场文书
上甘岭观后感
2015/06/10 职场文书
麦田里的守望者读书笔记
2015/06/30 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书
前端学习——JavaScript原生实现购物车案例
2021/03/31 Javascript
Vue组件更新数据v-model不生效的解决
2022/04/02 Vue.js
避坑之 JavaScript 中的toFixed()和正则表达式
2022/04/19 Javascript