浅谈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中的Document文档对象
Jan 16 Javascript
jquery BS,dialog控件自适应大小
Jul 06 Javascript
JavaScript实现的简单幂函数实例
Apr 17 Javascript
javascript实现简单的省市区三级联动
May 14 Javascript
jQuery打字效果实现方法(附demo源码下载)
Dec 18 Javascript
JavaScript知识点总结(十)之this关键字
May 31 Javascript
使用yeoman构建angular应用的方法
Aug 14 Javascript
Vue之Vue.set动态新增对象属性方法
Feb 23 Javascript
详解vue 项目白屏解决方案
Oct 31 Javascript
vue-cli安装使用流程步骤详解
Nov 08 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
Dec 03 Javascript
ant design vue的form表单取值方法
Jun 01 Vue.js
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实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
PHP获取php,mysql,apche的版本信息及更多服务器信息
2021/03/09 PHP
jQuery select的操作实现代码
2009/05/06 Javascript
Web 前端设计模式--Dom重构 提高显示性能
2010/10/22 Javascript
JS实现仿新浪微博发布内容为空时提示功能代码
2015/08/19 Javascript
15个常用的jquery代码片段
2015/12/19 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
2016/07/21 Javascript
老生常谈javascript中逻辑运算符&amp;&amp;和||的返回值问题
2017/04/13 Javascript
label+input实现按钮开关切换效果的实例
2017/08/16 Javascript
结合mint-ui移动端下拉加载实践方法总结
2017/11/08 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
JavaScript遍历DOM元素的常见方式示例
2019/02/16 Javascript
Vue formData实现图片上传
2019/08/20 Javascript
Python实现获取操作系统版本信息方法
2015/04/08 Python
Python psutil模块简单使用实例
2015/04/28 Python
用Python编写简单的定时器的方法
2015/05/02 Python
Python3 操作符重载方法示例
2017/11/23 Python
Python加载带有注释的Json文件实例
2018/05/23 Python
Python制作exe文件简单流程
2019/01/24 Python
Flask框架路由和视图用法实例分析
2019/11/07 Python
详解移动端h5页面根据屏幕适配的四种方案
2020/04/15 HTML / CSS
香蕉共和国加拿大官网:Banana Republic加拿大
2018/08/06 全球购物
法国一家多品牌成衣精品中/高档商店:Graduate Store
2019/08/28 全球购物
2014厂务公开实施方案
2014/02/17 职场文书
周年庆典主持词
2014/04/02 职场文书
三字经教学反思
2014/04/26 职场文书
纪律教育学习月活动总结
2014/08/27 职场文书
2014年学生会部门工作总结
2014/11/07 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
预备党员转正意见
2015/06/01 职场文书
Vue + iView实现Excel上传功能的完整代码
2021/06/22 Vue.js
Redis RDB技术底层原理详解
2021/09/04 Redis
mapstruct的用法之qualifiedByName示例详解
2022/04/06 Java/Android