浅谈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高级程序设计(第3版)学习笔记11 内建js对象
Oct 11 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
Dec 27 Javascript
详解iframe与frame的区别
Jan 13 Javascript
JavaScript几种数组去掉重复值的方法推荐
Apr 12 Javascript
jQuery1.9+中删除了live以后的替代方法
Jun 17 Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
Nov 25 Javascript
JS实现的RGB网页颜色在线取色器完整实例
Dec 21 Javascript
jQuery中on方法使用注意事项详解
Feb 15 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(下)
Apr 21 Javascript
妙用Angularjs实现表格按指定列排序
Jun 23 Javascript
JS正则表达式完美实现身份证校验功能
Oct 18 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
Sep 02 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验证码类实例分享
2013/12/27 PHP
PHP APC缓存配置、使用详解
2014/03/06 PHP
深入php内核之php in array
2015/11/10 PHP
php 变量引用与变量销毁机制详细介绍
2016/12/05 PHP
thinkPHP利用ajax异步上传图片并显示、删除的示例
2018/09/26 PHP
javascript 流畅动画实现原理
2009/09/08 Javascript
Dom 是什么的详细说明
2010/10/25 Javascript
js中查找最近的共有祖先元素的实现代码
2010/12/30 Javascript
编程语言JavaScript简介
2014/10/16 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
JavaScript中的ArrayBuffer详细介绍
2014/12/08 Javascript
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
浅析JS获取url中的参数实例代码
2016/06/14 Javascript
jQuery动态改变多行文本框高度的方法
2016/09/07 Javascript
Node.js发送HTTP客户端请求并显示响应结果的方法示例
2017/04/12 Javascript
浅谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/27 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
2017/11/09 Javascript
详解vue-cli 构建项目 vue-cli请求后台接口 vue-cli使用axios、sass、swiper
2018/05/28 Javascript
Vue自定义全局Toast和Loading的实例详解
2019/04/18 Javascript
js的新生代垃圾回收知识点总结
2019/08/22 Javascript
微信小程序picker组件两列关联使用方式
2020/10/27 Javascript
使用Python下载Bing图片(代码)
2013/11/07 Python
python制作小说爬虫实录
2017/08/14 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
pandas ix &amp;iloc &amp;loc的区别
2019/01/10 Python
Django的Modelforms用法简介
2019/07/27 Python
Python 2种方法求某个范围内的所有素数(质数)
2020/01/31 Python
Python代码执行时间测量模块timeit用法解析
2020/07/01 Python
牧马人澳大利亚官网:Wrangler澳大利亚
2019/10/08 全球购物
税务会计岗位职责
2014/02/18 职场文书
建筑工程专业大学生求职信
2014/04/23 职场文书
品牌转让协议书
2014/08/20 职场文书
综治工作汇报材料
2014/10/27 职场文书
明星邀请函
2015/02/02 职场文书
机关单位保密工作责任书
2015/05/11 职场文书
高老头读书笔记
2015/06/30 职场文书