浅谈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改变position值实现菜单滚动至顶部后固定
Jan 18 Javascript
防止xss和sql注入:JS特殊字符过滤正则
Apr 18 Javascript
JS获取IP、MAC和主机名的五种方法
Nov 14 Javascript
js变形金刚文字特效代码分享
Aug 20 Javascript
实例讲解jquery与json的结合
Jan 07 Javascript
Vue.js系列之项目结构说明(2)
Jan 03 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
Jan 23 Javascript
小程序实现多列选择器
Feb 15 Javascript
VsCode与Node.js知识点详解
Sep 05 Javascript
vue解决使用$http获取数据时报错的问题
Oct 30 Javascript
vue.js实现简单购物车功能
May 30 Javascript
Node 使用express-http-proxy 做api网关的实现
Oct 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实现通过Luhn算法校验信用卡卡号是否有效
2015/03/23 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
JQuery将文本转化成JSON对象需要注意的问题
2011/05/09 Javascript
js三种排序算法分享
2012/08/16 Javascript
jquery文字上下滚动的实现方法
2013/03/22 Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
2013/07/05 Javascript
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
JavaScript中的无阻塞加载性能优化方案
2014/10/10 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
javascript递归回溯法解八皇后问题
2015/04/22 Javascript
jquery自定义插件开发之window的实现过程
2016/05/06 Javascript
浅谈jQuery中的checkbox问题
2016/08/10 Javascript
JavaScript中的return布尔值的用法和原理解析
2017/08/14 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
2019/10/15 Javascript
js数据类型转换与流程控制操作实例分析
2019/12/18 Javascript
python从入门到精通(DAY 3)
2015/12/20 Python
Python的“二维”字典 (two-dimension dictionary)定义与实现方法
2016/04/27 Python
Python编程实现的简单Web服务器示例
2017/06/22 Python
python处理自动化任务之同时批量修改word里面的内容的方法
2019/08/23 Python
对python中的装包与解包实例详解
2019/08/24 Python
numpy 返回函数的上三角矩阵实例
2019/11/25 Python
pytorch方法测试详解——归一化(BatchNorm2d)
2020/01/15 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
Conforama西班牙:您的家具、装饰和电器商店
2020/02/21 全球购物
高二历史教学反思
2014/01/25 职场文书
省级优秀班集体申报材料
2014/05/25 职场文书
学校志愿者活动总结
2014/06/27 职场文书
学校感恩教育活动总结
2014/07/07 职场文书
单位证明范文
2015/06/18 职场文书
结婚司仪主持词
2015/06/29 职场文书
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang
vue里使用create, mounted调用方法
2022/04/26 Vue.js