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 相关文章推荐
Mootools 1.2教程 正则表达式
Sep 15 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
Dec 30 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
Sep 13 Javascript
关于setInterval、setTimeout在jQuery中的使用注意事项
Sep 28 Javascript
JS下拉框内容左右移动效果的具体实现
Jul 10 Javascript
在服务端(Page.Write)调用自定义的JS方法详解
Aug 09 Javascript
JS实现匀速运动的代码实例
Nov 29 Javascript
jQuery中:focus选择器用法实例
Dec 30 Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
Nov 05 Javascript
vue 项目接口管理的实现
Jan 17 Javascript
详解Vue项目中实现锚点定位
Apr 24 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
Jul 28 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和ACCESS写聊天室(二)
2006/10/09 PHP
PHP文件锁函数flock()详细介绍
2014/11/18 PHP
PHP的pcntl多进程用法实例
2015/03/19 PHP
新浪微博OAuth认证和储存的主要过程详解
2015/03/27 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
2016/10/18 PHP
Smarty模板常见的简单应用分析
2016/11/15 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
js获取当前月的第一天和最后一天的小例子
2013/11/18 Javascript
jquery 删除字符串最后一个字符的方法解析
2014/02/11 Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
2014/08/27 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
jQuery实现textarea自动增长宽高的方法
2015/12/18 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
2016/06/21 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
原生js实现打字动画游戏
2017/02/04 Javascript
js实现华丽的九九乘法表效果
2017/03/29 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
详解基于webpack&amp;gettext的前端多语言方案
2019/01/29 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
Vue实现背景更换颜色操作
2020/07/17 Javascript
[41:08]2014 DOTA2国际邀请赛中国区预选赛 HGT VS NE
2014/05/22 DOTA
Python利用matplotlib做图中图及次坐标轴的实例
2019/07/08 Python
由面试题加深对Django的认识理解
2019/07/19 Python
pytorch中的自定义数据处理详解
2020/01/06 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
CSS3 实现发光边框特效
2020/11/11 HTML / CSS
canvas实现圆绘制的示例代码
2019/09/11 HTML / CSS
美国最大的团购网站:Groupon
2016/07/23 全球购物
小学生田径运动会广播稿
2014/09/11 职场文书
民主生活会对照检查材料
2014/09/22 职场文书
启动Tomcat时出现大量乱码的解决方法
2021/06/21 Java/Android
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
2021/06/30 SQL Server
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL