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 相关文章推荐
javascript每日必学之封装
Feb 23 Javascript
JQuery学习总结【一】
Dec 01 Javascript
AngularJS表单验证功能分析
May 26 Javascript
深入理解vue中的$set
Jun 01 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
Jul 31 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
Mar 13 Javascript
微信小程序中遇到的iOS兼容性问题小结
Nov 14 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
Sep 02 Javascript
JS Canvas接口和动画效果大全
Apr 29 Javascript
vue+springboot实现登录验证码
May 27 Vue.js
javascript拖曳互换div的位置实现示例
Jun 28 Javascript
javascript代码简写的几种常用方式汇总
Aug 23 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中,文件上传
2006/12/06 PHP
PHP新手入门学习方法
2011/05/08 PHP
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
使用PHP求两个文件的相对路径
2013/06/20 PHP
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
PHP基于SPL实现的迭代器模式示例
2018/04/22 PHP
科讯商业版中用到的ajax空间与分页函数
2007/09/02 Javascript
Safari5中alert的无限循环BUG
2011/04/07 Javascript
jquery一般方法介绍 入门参考
2011/06/21 Javascript
JQuery中使用on方法绑定hover事件实例
2014/12/09 Javascript
jQuery实现的仿百度分页足迹效果代码
2015/10/30 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
2015/12/08 Javascript
JQuery DIV 动态隐藏和显示的方法
2016/06/23 Javascript
如何解决vue与传统jquery插件冲突
2017/03/20 Javascript
详解Vue中使用v-for语句抛出错误的解决方案
2017/05/04 Javascript
详解jQuery获取特殊属性的值以及设置内容
2018/11/14 jQuery
Javascript之高级数组API的使用实例
2019/03/08 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
2019/09/12 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
如何检测JavaScript中的死循环示例详解
2020/08/30 Javascript
python中函数总结之装饰器闭包详解
2016/06/12 Python
Python 稀疏矩阵-sparse 存储和转换
2017/05/27 Python
python的exec、eval使用分析
2017/12/11 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
python中操作文件的模块的方法总结
2021/02/04 Python
使用css3和jquery实现可伸缩搜索框
2014/02/12 HTML / CSS
HTML5 MiranaVideo播放器 (代码开源)
2010/06/11 HTML / CSS
Canvas环形饼图与手势控制的实现代码
2019/11/08 HTML / CSS
大型营销活动计划书
2014/04/28 职场文书
团队拓展活动方案
2014/08/28 职场文书
小组口号霸气押韵
2015/12/24 职场文书
创业计划书之青年旅馆
2019/09/23 职场文书