JavaSript中变量的作用域闭包的深入理解


Posted in Javascript onMay 12, 2014
<!DOCTYPE html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<title>Insert title here</title> 
<script type="text/javascript"> 
/* 
* 1.js中的变量都是公用的. 
2.js中没有静态变量 
3.闭包:函数内部可以调用函数外部的变量;反之,则不行 
*/ var r=10; 
function test1(){ 
var r2="abc"; 
//alert(r) 
} 
//alert(r2);//不能访问的函数内部的r2 
test1(); 
//嵌套的函数中也ok啦 
function test2(num1){ 
function test3(num2,num3){ 
return num2+num3+num1; 
} 
return test3(10,20) 
} 
//alert(test2(30)); 
//---------循环中的闭包------------------------ 
function testfun(){ 
var r=1; 
var arr=[]; 
for(var x=0;x<3;x++){ 
r++; 
arr[x]=function(){ 
return r; 
} 
} 
return arr; 
} 
alert("testfun:"+testfun()); 
var arr2=testfun(); 
alert("arr:"+arr2[0]); 
alert("arr:"+arr2[1]()); 
alert("arr:"+arr2[2]()); 
//==========以上三个弹出框的结果都是4========== 
/*分析原因: 
理解一下在JavaScript中函数是什么? 
函数就是一段可执行的代码块,函数也是可以用一个变量表示,比如函数的第二种定义方式 
var add=new Function("a","return a+10");底层的本质就是这个函数名指向 
了这一段为变量而创建的可执行的代码。 
* 首先当testfun函数执行完毕以后,arr[0],arr[1],arr[]中都是存储了相同的 
可执行代码块function(){ 
return r 
}也就是说上面三个是函数变量而已,要执行它们只需要在变量名称后面加()就ok了 
而且这个时候r的值4 
当执行arr[0]()相当于执行了这个代码块中的代码。 
所以最终的结果return r,当然返回4了。 
*/ 
</script> 
</head> 
<body> 
</body> 
</html>
Javascript 相关文章推荐
js 深拷贝函数
Dec 04 Javascript
解决css和js的{}与smarty定界符冲突问题的两种方法
Sep 10 Javascript
jQuery阻止事件冒泡具体实现
Oct 11 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
May 07 Javascript
JavaScript实现大数的运算
Nov 24 Javascript
使用命令对象代替switch语句的写法示例
Feb 28 Javascript
在JavaScript中用getMinutes()方法返回指定的分时刻
Jun 10 Javascript
分享jQuery封装好的一些常用操作
Jul 28 Javascript
AngularJS 面试题集锦
Sep 06 Javascript
jquery对Json的各种遍历方法总结(必看篇)
Sep 29 Javascript
js实现碰撞检测特效代码分享
Oct 16 Javascript
React 使用recharts实现散点地图的示例代码
Dec 07 Javascript
Javascript中的回调函数和匿名函数的回调示例介绍
May 12 #Javascript
JavaScript中对象属性的添加和删除示例
May 12 #Javascript
构造函数+原型模式构造js自定义对象(最通用)
May 12 #Javascript
Javascript中对象继承的实现小例
May 12 #Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
May 12 #Javascript
js图片处理示例代码
May 12 #Javascript
jquery实现的一个简单进度条效果实例
May 12 #Javascript
You might like
PHP实现的功能是显示8条基色色带
2006/10/09 PHP
PHP以指定字段为索引返回数据库所取的数据数组
2013/06/30 PHP
php中使用PHPExcel读写excel(xls)文件的方法
2014/09/15 PHP
PHP使用feof()函数读文件的方法
2014/11/07 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
2015/01/07 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
PHP实现登录验证码校验功能
2018/05/17 PHP
js中匿名函数的N种写法
2010/09/08 Javascript
基于JQuery实现CheckBox全选全不选
2011/06/27 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
JavaScript Array对象详解
2016/03/01 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
使用ReactJS实现tab页切换、菜单栏切换、手风琴切换和进度条效果
2016/10/17 Javascript
详解Javascript函数声明与递归调用
2016/10/22 Javascript
JavaScript模仿Pinterest实现图片预加载功能
2016/10/25 Javascript
读Javascript高性能编程重点笔记
2016/12/21 Javascript
深入理解JavaScript中的预解析
2017/01/04 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
layui 表单标签的校验方法
2019/09/04 Javascript
基于JS+HTML实现弹窗提示是否确认提交功能
2020/06/17 Javascript
vue单文件组件无法获取$refs的问题
2020/06/24 Javascript
Python中splitlines()方法的使用简介
2015/05/20 Python
django自带的server 让外网主机访问方法
2018/05/14 Python
python自动发微信监控报警
2019/09/06 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
第二课堂活动总结
2014/05/07 职场文书
群教个人对照检查材料
2014/08/20 职场文书
2015年元旦演讲稿
2014/09/12 职场文书
横店影视城导游词
2015/02/06 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书
体育部部长竞选稿
2015/11/21 职场文书
MATLAB 如何求取离散点的曲率最大值
2021/04/16 Python
java.util.NoSuchElementException原因及两种解决方法
2022/06/28 Java/Android