局部变量

详解JavaScript中的函数与闭包

我是研究僧i 提交于 2019-12-07 15:54:03
闭包这东西,说难也难,说不难也不难,下面我就以自己的理解来说一下闭包。 一、闭包的解释说明 对于函数式语言来说,函数可以保存内部的数据状态。对于像C#这种编译型命令式语言来说,由于代码总是在代码段中执行,而代码段是只读的,因此函数中的数据只能是静态数据。函数内部的局部变量存放在栈上,在函数执行结束以后,所占用的栈被释放,因此局部变量是不能保存的。 Javascript采用词法作用域,函数的执行依赖于 变量作用域 , 这个作用域是在定义函数时确定的 。因此Javascript中函数对象不仅保存代码逻辑,还必须引用当前的作用域链。Javascript中函数内部的局部变量可以被修改,而且当再次进入到函数内部的时候,上次被修改的状态仍然持续。这是因为因为局部变量并不保存在栈上,而是通过一个对象来保存。 决定使用哪个变量是查找作用域链后决定的。 1.每次 定义函数时 ,都会为之创建一个作用域链; 2.每次 调用函数时 ,会创建一个新的对象用来保存变量(局部变量和参数),并且把这个用于保存变量的对象加入作用域链前端。 如果没有局部变量的话,这个保存变量的对象就只包含arguments,也就是用来保存参数。设想这么一种情况,如果内层函数定义时恰逢外层函数正被调用执行,那么内层函数就会把外层函数运行时这个保存变量的对象纳入自己的作用域链中。 用代码来举例,外层匿名函数执行了10次

局部变量与全局变量

自作多情 提交于 2019-12-07 09:06:51
变量作用域:变量的可用范围 按照作用域的不同,变量可以分为:局部变量和全局变量 特点:不同作用内出现同名变量,内部作用域的变量会覆盖外部作用的变量 局部变量:定义在函数内部的变量以及函数的形参称为局部变量 作用域:从定义哪一行开始直到与其所在的代码块结束 生命周期:从程序运行到定义哪一行开始分配存储空间到程序离开该变量所在的作用域 特点: 1、相同作用域内不可以定义同名变量 2、不同作用范围可以定义同名变量,内部作用域的变量会覆盖外部作用域的变量 Int main(){ int age = 5; if(age==5){ int height = 1; }// height的作用域在此处就结束了 printf(“年龄为:%d”,age);//对 printf(“身高为:%d”,height);//错 } Int main(){ char *home = “你家”; char *harry = “外边的流浪狗”; if(strcmp(home,”你家”)==0){ char *harry= “你们家的狗”; printf(“harry = %s”,harry); //输出 你们家的狗 } } 全局变量:定义在函数外边的变量称为全局变量 作用域范围:从定义哪行开始直到文件结尾 生命周期:程序一启动就会分配存储空间,直到程序结束 存储位置:静态存储区 Int num = 10 /

为什么局部变量必须手动赋值?而全局变量不用手动赋值也可以初始化?

拜拜、爱过 提交于 2019-12-06 17:40:59
实在知乎上看的答案,感觉很好,就转载一下,原文地址: 为什么全局变量无须初始化,局部变量必须初始化? https://www.zhihu.com/question/30516949 Intopass 回答一: 首先 Java 语言就是这么规定的。 然后为什么 Java 语言要这么规定呢?有什么内部机理吗? 可能的原因如下,当我们新建一个对象时,Java会在Heap中申请一块内存区域用以存放类的数据。而成员变量就是类的数据,也是放在这块内存区域中的。只需要JVM在申请内存的时候顺便把整块区域都置为零即可完成初始化,方便快捷。 而对于方法的局部变量,是在线程的Stack中,当然Stack他也可以帮我们初始化,不过有一个问题。对于有些局部变量,在方法的一开始是没有的,有些在循环中的局部变量是要反复的声明多次的。有些局部变量作用域结束后,另一个局部变量又会占用这个局部变量的位置。 那么初始化要放在何时呢?当然JVM可以帮我们初始化多次,不过那样或许会带来性能问题。 for (int i = 0; i < 10; i++) { int n; if (i % 2 == 0) { n = 10; } else { n = 20; } } 像是这个n,我们完全不用JVM帮我们初始化,如果每次循环他都帮我们初始化一次,那么是没有必要的。综上所述,对于局部变量,可能不帮我们初始化是一个不错的选择。

细说JVM内存模型

与世无争的帅哥 提交于 2019-12-06 16:13:35
细说JVM内存模型 前言 在正式学习 JVM 内存模型之前,先注意以下几个是问题: JVM 内存模型与 JAVA 内存模型不是同一个概念。JVM 内存模型是从运行时数据区的结构的角度描述的概念;而 JAVA 内存模型是从主内存和线程私有内存角度的描述。从以下两张图可以看出: ​ JAVA内存模型 ​ JVM内存模型 Java虚拟机总共由三大模块组成: 类加载器子系统 运行时数据区执行引擎 本篇我们介绍第二大模块——运行时数据区(JVM内存模型)。 其实虚拟机的这些模块并不是独立的,都是相互联系的。java 文件编译为 class 文件,通过类加载子系统加载,信息再到 JVM 托管的内存中(部分操作会与本地内存交互)的流转,再到垃圾回收等等,都是一系列的操作。 本系列的博客为了更加清晰的描述清楚功能和原理,将其分为几个章节写作。 概览 运行时数据区分为几大模块(如上图所示): 线程共享区: JAVA堆 方法区 线程私有区: JAVA栈 本地方法栈 程序计数器 本文中,我们将从以下几个方法面来分析各个区域: 功能 存储的内容 是否有内存溢出和内存泄露 是否进行垃圾回收 对应的垃圾回收算法 垃圾回收流程 性能调优 线程私有区 程序计数器 程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器

Java第4章学习总结

穿精又带淫゛_ 提交于 2019-12-06 13:22:00
第4章 类与对象 4.1编程语言的几个发展阶段 面向对象编程的三个特性:封装性、继承、多态 4.2类 ①类的定义包括类声明和类体 class 类名{ 类体的内容 } class是关键字,用来定义类。 “class 类名”是类的声明部分。 ②成员变量在整个类内都有效 ③局部变量没有默认值 局部变量的名字可以与成员变量的名字相同,若想要在该方法中使用被隐藏的成员变量,必须使用关键字this。 4.3构造方法与对象的创建 ①类中的构造方法的名字必须与它所在类的名字完全相同,而且没有类型。 4.4类与程序的基本结构 4.5参数传值 在java中,方法的所有参数都是“传值”的,也就是说,方法中参数变量的值是调用者指定的值的拷贝。 4.7实例成员与类成员 代码调试中的问题和解决过程 来源: CSDN 作者: 今天也想吃冰淇淋 链接: https://blog.csdn.net/qq920896923/article/details/83052119

函数的返回值和作用域

南笙酒味 提交于 2019-12-06 12:42:30
一、返回值return 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,即 return 语句代表着函数的结束 如果未在函数中指定return,那这个函数的返回值为None 二、全局变量和局部变量 在函数中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。 全局变量作用域(即有效范围)是整个程序,局部变量作用域是定义该变量的函数。 变量的查找顺序是局部变量>全局变量 当全局变量与局部变量同名时,在定义局部变量的函数内,局部变量起作用;在其它地方全局变量起作用。 在函数里是不能直接修改全局变量的 在函数内如何修改全局变量: 在函数内声明全局变量: gloal 变量名 name = "aaa" def chang_name: 来源: https://www.cnblogs.com/nanjo4373977/p/11984516.html

jvm指令

≯℡__Kan透↙ 提交于 2019-12-06 11:50:57
1.反编译指令: javap -c xxx.class 2.jvm指令集: 指令码 助记符 功能描述 0x00 nop 无操作 0x01 aconst_null 指令格式: aconst_null 功能描述: null进栈。 指令执行前 指令执行后 栈底 ... ... null 栈顶 注意:JVM并没有为null指派一个具体的值。 0x02 iconst_m1 int型常量值-1进栈 0x03 iconst_0 int型常量值0进栈 0x04 iconst_1 int型常量值1进栈 0x05 iconst_2 int型常量值2进栈 0x06 iconst_3 int型常量值3进栈 0x07 iconst_4 int型常量值4进栈 0x08 iconst_5 int型常量值5进栈 0x09 lconst_0 long型常量值0进栈 0x0A lconst_1 long型常量值1进栈 0x0B fconst_0 float型常量值0进栈 0x0C fconst_1 float型常量值1进栈 0x0D fconst_2 float型常量值2进栈 0x0E dconst_0 double型常量值0进栈 0x0F dconst_1 double型常量值1进栈 0x10 bipush 将一个byte型常量值推送至栈顶 0x11 sipush 将一个short型常量值推送至栈顶 0x12

成员变量和局部变量的区别

十年热恋 提交于 2019-12-06 10:58:14
1.定义位置不同。 局部变量定义在方法内部,成员变量定义在方法外部,在某个类内部。 2.作业范围不同。 局部变量只在方法内起作用,成员变量可以在方法外访问到。 3.默认值不同。 成员变量的默认值即为该数据类型的初始值,而局部变量没有默认值,在使用之前一定要先初始化。 class Person{ private String name;//成员变量,在方法外,类内部 private int age; public void show(int i){ //i也是局部变量,不需要初始化,因为调用方法时一定会传入i的具体值 String str="hello";//局部变量,方法内部才有作用,必须初始化 System.out.println(str+"这是第"+i+"个人"); } String str2=str;//报错,因为str是局部变量,方法外不能访问 String str3=name;//不报错,name初始值为null,所以str3的值也为null } 来源: https://www.cnblogs.com/iceywu/p/11979576.html

5.3.8 栈帧

不问归期 提交于 2019-12-06 10:56:45
栈帧由三部分组成:局部变量区,操作数找和帧数据区。局部变量区和操作数栈的大小要 视对应的方法而定,它们是按字长计算的。编译器在编译时就确定了这些值并放在class文件中。 而帧数据区的大小依赖于具体的实现。 当虚拟机调用一个Java方法时,它从对应类的类型信息中得到此方法的局部变量区和操作数 栈的大小,并据此分配栈帧内存,然后压人Java栈中。 局部变量区 Java栈帧的局部变量区被组织为一个以字长为单位、从0开始计数的数组。字 节码指令通过从0开始的索引来使用其中的数据。类型为int、float, reference和returnAddress的值在数组中只占据一项,而类型为byte、short和char的值在存人数组前都将被转换为int值,因而同样占据一项。但是类型为long和double的值在数组中却占据连续的两项。 在访问局部变量中的long和double值的时候,指令只需指出连续两项中第一项的索引值。例 如某个long值占据第3、4项,那么指令会取索引为3的long值。局部变量区的所有值都是字对齐 的,long和double这样占据两项数组元素的值同样可以起始于任何索引。 局部变量区包含对应方法的参数和局部变量。编译器首先按声明的顺序把这些参数放入局 部变量数组。图5-9描绘了下面两个方法的局部变量区。 我们注意到,在源代码中的byte、short.

java线程——线程局部变量

让人想犯罪 __ 提交于 2019-12-06 10:37:27
一,线程局部变量ThreadLocal的作用   用于实现线程内部的数据共享, 既对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,在另一个线程访问的时候,访问的由是另一份数据 。   每个线程调用ThreadLocal对象的set方法时,就相当于向内部Map集合中增加一条记录。   Map(key,value)key相当于当前的线程,value相当于set()传递进来的值。   ThreadLocal<T> threadLocal =new ThreadLocal<T>(); T是set()方法传进来的值类型。 问题:一个ThreadLocal中只能存放一个变量,既其中只能存放一个数据,如果由两个数据,可以定义两个ThreadLocal,但是如果有多个呢?例如100个?   解决方法是定义一个对象来存放这100个数据,然后在ThreadLocal中存放这个对象。 二,在 Runnable 中创建 ThreadLocal 在线程类内部创建 ThreadLocal,基本步骤如下:   ①、在多线程的类(如 ThreadDemo 类)中,创建一个 ThreadLocal 对象 threadXxx,用来保存线程间需要隔离处理的对象 xxx。   ②、在 ThreadDemo 类中,创建一个获取要隔离访问的数据的方法 getXxx(),在方法中判断,若ThreadLocal