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

<!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>

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

时间: 2024-10-26 07:30:40

JavaSript中变量的作用域 闭包的理解的相关文章

作用域+闭包+this理解

函数预解析过程   函数会覆盖同名变量 也就是var  他的优先级高   如果是同名函数则后者覆盖前者   逐行解读代码的时候 表达式 和参数 会改变预解析仓库里面的值..也就是表达式能干掉函数   域和域之间的关系 <script>标签存在上下文关系   走完上下文标签的变量  下面的可以用上面的   自上而下  函数  json等 子级作用域到父级作用域的过程 叫作用域链        由里到外 当子级找不到变量 会到父级找  如果有表达式的话就会更改全局变量 也就是函数里面没有var  

注意for循环中变量的作用域

for e in collections: pass 在for 循环里, 最后一个对象e一直存在在上下文中.就是在循环外面,接下来对e的引用仍然有效. 这里有个问题容易被忽略,如果在循环之前已经有一个同名对象存在,这个对象是被覆盖的. 如果在有代码感知的IDE中, IDE会提示变量是“被重新声明的”, 但运行时却不会出错. for循环不是闭包,可以使用dis模块分解以下代码可以看到: x = 5 for x in range(10): pass print x 将代码保存到test.py文件,运

Python中变量的作用域(variable scope)

http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 """ 4 ------------------------------------------------------------------------------- 5 Function: 6 [整理

if、while中变量的作用域问题

我们知道,函数.类会改变当前变量的作用域.if,while等分支循环结构会继承外部作用域,即外部变量对分支循环结构内部可见. 但是C语言不支持if,while等分支循环结构内部作用域对外可见,而PHP则不然. 在PHP中,if,while等分支循环结构中声明的局部变量,在分支循环结构后面仍然有效. 比如,函数中声明的变量在函数外面是不可见的 C语言:01 #include<stdio.h>02  03 int foo()04 {05     int bar;06     bar  = 3;07

C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期

全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内存分布:全局数据区 注意:如果在两个文件中都定义了相同名字的全局变量,连接出错:变量重定义 全局静态变量 作用域:文件作用域(只在被定义的文件中可见.) 生命周期:程序运行期一直存在 内存分布:全局数据区 定义方法:static关键字,const 关键字 注意:只要文件不互相包含,在两个不同的文件中

JavaScript 中变量、作用域和内存问题的学习

这是我学习JavaScript的第二篇文章,之前做过几年的Java开发,发现JavaScript虽然也是面向对象的语言但是确实有很多不同之处.就本篇博客,主要学习总结一下最近学习到的JavaScript的知识,其中有些是网络上的,不过对于理解JavaScript,和在工作总是会很实用的,所以总结了下来: 那么就开始吧,首先是变量 在JavaScript中变量分为两种:一种是基本类型,基本类型值在内存中占用固定大小的空间,因此被保存在栈内存中.从一个变量向另一个变量复制基本类型的值,会创建这个值的

C/C++中变量的作用域和存储类型简介

写在开头 对于很多C/C++的初学者来说,很容易理不清变量的作用域和存储类型这一块的一些概念,也容易将其中的一些概念搞混淆.作为一个C/C++的初学者,笔者希望在这里能够尝试着去理一理这些较为繁杂的概念,主要当作自己备忘之用.当然,由于笔者水平有限,经验不足,在这里也只能罗列一些常用概念和使用方法,且可能会有些许不专业之处,望君理解并指正. 一定要把变量的作用域和存储类型分开来看 很多人很容易把变量的作用于和存储类型搞混,但其实只要我们从它们定义出发来看,这个问题是很容易解决的.作用域是一个变量

Js中变量的作用域

一.理解函数作用域需要理解以下几点:    1.函数变量的作用域有全局变量和局部变量两种,全局变量写在函数的最前面,局部变量写在函数体内,局部变量省略了var 也就默认成为了全局变量!    2.函数体内部可以读取到函数外的变量,而函数外不能读取到函数内的变量! 在理解了函数变量的作用域之后,也需要理解函数的作用域链了:    1.每一个函数都有一个与之相关的作用域链,当js在查找变量X时,它会从链的第一个对象开始查找,如果这个对象有一个名为X的属性值,则会直接使用这个 属性值,如果没有就继续下

js中变量、作用域及内存

一.变量及作用域 1.基本类型和引用类型的值 ECMAScript变量可能包含两种不同的数据类型的值:基本类型值和引用类型值.基本类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置.而引用类型值则是指那些保存在堆内存中的对象,意思是变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,该位置保存对象. 将一个值赋给变量时,解析器必须确定这个值是基本类型值,还是引用类型值.基本类型值有以下几种:Undefined.Null.Boolean.Number和Str