浅谈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 的 prototype问题。
Jan 03 Javascript
如何快速的呈现我们的网页的技巧整理
Jul 01 Javascript
jquery的trigger和triggerHandler的区别示例介绍
Apr 20 Javascript
Javascript进制转换实例分析
May 14 Javascript
用v-html解决Vue.js渲染中html标签不被解析的问题
Dec 14 Javascript
AngularJS ui-router (嵌套路由)实例
Mar 10 Javascript
利用jQuery异步上传文件的插件用法详解
Jul 19 jQuery
jQuery 禁止表单用户名、密码自动填充功能
Oct 30 jQuery
详解如何在vue项目中使用lodop打印插件
Sep 27 Javascript
jQuery事件blur()方法的使用实例讲解
Mar 30 jQuery
JavaScript实现简单验证码
Aug 24 Javascript
vue实现图片裁剪后上传
Dec 16 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 八种基本的数据类型小结
2011/06/01 PHP
PHP 代码规范小结
2012/03/08 PHP
php set_time_limit()函数的使用详解
2013/06/05 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
php求数组全排列,元素所有组合的方法总结
2017/03/14 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
学习ExtJS accordion布局
2009/10/08 Javascript
javascript中注册和移除事件的4种方式
2013/03/20 Javascript
JS自动适应的图片弹窗实例
2013/06/29 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
js获取对象为null的解决方法
2013/11/21 Javascript
javascript中2个感叹号的用法实例详解
2014/09/04 Javascript
JS扩展方法实例分析
2015/04/15 Javascript
详解Angularjs filter过滤器
2016/02/06 Javascript
jquery+ajax+text文本框实现智能提示完整实例
2016/07/09 Javascript
微信小程序wx:for和wx:for-item的用法详解
2018/04/01 Javascript
详解iframe跨域的几种常用方法(小结)
2019/04/29 Javascript
解决layui checkbox 提交多个值的问题
2019/09/02 Javascript
高性能js数组去重(12种方法,史上最全)
2019/12/21 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
vue实现购物车列表
2020/06/30 Javascript
[06:53]2018DOTA2国际邀请赛寻真——勇于创新的Vici Gaming
2018/08/14 DOTA
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
Python实现识别手写数字大纲
2018/01/29 Python
python3 kmp 字符串匹配的方法
2018/07/07 Python
pytorch使用 to 进行类型转换方式
2020/01/08 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
用Python爬取LOL所有的英雄信息以及英雄皮肤的示例代码
2020/07/13 Python
详解css3使用transform出现字体模糊的解决办法
2020/10/16 HTML / CSS
NBA欧洲商店(西班牙):NBA Europe Store ES
2019/04/16 全球购物
database面试题
2013/03/28 面试题
诺思信科技(南京)有限公司.NET笔试题答案
2013/07/06 面试题
化工专业大学生职业生涯规划书
2014/01/14 职场文书
学习社交礼仪心得体会
2016/01/22 职场文书
为什么你写的height:100%不起作用
2021/05/10 HTML / CSS