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基于面向对象实现的放烟花效果
May 07 Javascript
Js 获取当前函数参数对象的实现代码
Jun 20 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
Sep 19 Javascript
微信小程序 解决swiper不显示图片的方法
Jan 04 Javascript
JavaScript实现网页头部进度条刷新
Apr 16 Javascript
浅谈Vue-cli 命令行工具分析
Nov 22 Javascript
webpack中使用iconfont字体图标的方法
Feb 22 Javascript
webstorm和.vue中es6语法报错的解决方法
May 08 Javascript
Vue实现按钮旋转和移动位置的实例代码
Aug 09 Javascript
使用javascript做时间倒数读秒功能的实例
Jan 23 Javascript
微信小程序使用map组件实现检索(定位位置)周边的POI功能示例
Jan 23 Javascript
JavaScript实现简易计算器小功能
Oct 22 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
Zerg兵种介绍
2020/03/14 星际争霸
php 静态变量的初始化
2009/11/15 PHP
php基于PDO连接MSSQL示例DEMO
2016/07/13 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
将nodejs打包工具整合到鼠标右键的方法
2013/05/11 NodeJs
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
jquery删除table当前行的实例代码
2016/10/07 Javascript
原生js代码实现图片放大境效果
2016/10/30 Javascript
AngularJS Toaster使用详解
2017/02/24 Javascript
几种响应式文字详解
2017/05/19 Javascript
ReactNative短信验证码倒计时控件的实现代码
2017/07/20 Javascript
js数组方法reduce经典用法代码分享
2018/01/07 Javascript
基于node下的http小爬虫的示例代码
2018/01/11 Javascript
vue多页面开发和打包正确处理方法
2018/04/20 Javascript
微信小程序使用字体图标的方法
2019/05/23 Javascript
vue中监听路由参数的变化及方法
2019/12/06 Javascript
详解如何使用React Hooks请求数据并渲染
2020/10/18 Javascript
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
python中使用xlrd、xlwt操作excel表格详解
2015/01/29 Python
Python中的自省(反射)详解
2015/06/02 Python
利用 Monkey 命令操作屏幕快速滑动
2016/12/07 Python
将python文件打包成EXE应用程序的方法
2019/05/22 Python
pyqt5中QThread在使用时出现重复emit的实例
2019/06/21 Python
python爬虫可以爬什么
2020/06/16 Python
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
德国运动营养和健身网上商店:Myprotein.de
2018/07/18 全球购物
印尼综合在线预订网站:Tiket.com(机票、酒店、火车、租车和娱乐)
2018/10/11 全球购物
商场经理竞聘演讲稿
2014/01/01 职场文书
社团成立邀请函
2014/01/08 职场文书
电工工作职责范本
2014/02/22 职场文书
期末评语大全
2014/05/04 职场文书
捐款感谢信
2015/01/20 职场文书
介绍信怎么写
2015/01/30 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
Redis入门基础常用操作命令整理
2022/06/01 Redis