当前位置:首页 » 文件传输 » 执行环境访问变量类型及顺序
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

执行环境访问变量类型及顺序

发布时间: 2022-08-22 13:49:31

1. 变量,作用域知多少

ECMAScript的的变量有两种类型:
基本类型(值类型):简单数据段
引用类型:多个值构成的对象
在变量赋值结束后,解析器必须知道这个变量时基本数据类型还是引用类型,需要注意的是string在js中是值类型。
复制的差异
值类型的复制会在内存中创建副本,所以彼此间不会影响,但是引用类型只是将变量的引用复制,其指向的仍然是一个对象,会相互影响:
1 var a = {};
2 a.a = 6;
3 var b = a;
4 b.a = 66;
5 alert(a.a);//66

这是一个典型的例子,值类型的就不举例了。
执行环境与作用域
PS:作用域是面试官的最爱,也是我们经常栽跟头的地方,这块我们有必要搞清楚
执行环境(execution)是javascript中非常重要的一个概念。
执行环境定义了变量或者函数有权限访问其他数据,决定了他们各自的行为。
每一个执行环境都有一个与之关联的变量对象(variable object),环境中定义的所有变量和函数都保存到这个对象中,虽然代码无法访问,但是解析器会用到他。
在web浏览器中window对象便是我们的全局执行环境(最外围的执行环境,宿主不同便有差异,比如node.js可能就不一样),因此所有全局变量和函数都是作为window对象的属性或者方法创建的。
销毁
某个执行环境中的所有代码执行完毕,该环境便销毁,变量对象中的属性和函数也就完蛋了(闭包会让情况有所不同)。
函数作用域
每个函数都有自己的“作用域”范围(执行环境),当执行流进入一个函数时,函数的环境就会进入一个环境栈中,在函数执行完毕后,栈会将其环境弹出,控制权又重新交回之前的环境。ECMAScript程序的执行流就是这个机制在控制。
作用域链
当代码在一个环境中执行时会创建变量对象(variable object),并且该对象拥有一个作用域链,作用域链的用途是保证对执行环境有权限访问的所有变量与函数的有序访问。
作用域的最前端便是当前执行代码所在环境的变量对象,若这个变量时函数,就将其活动对象(activation object)作为变量对象,
活动对象最开始只包含一个变量arguments,整个作用域链会一直向上延伸直到window,这里上一个经典的例子:

1 var color = 'blue';
2 function changeColor() {
3 var anotherColor = 'red';
4 function swapColor() {
5 var tmpColor = anotherColor;
6 anotherColor = color;
7 color = tmpColor;
8 }
9 swapColor();
10 }
11 changeColor();

以上代码涉及三个执行环境(execution context):
① 全局环境
② changeColor局部环境
③ swapColor局部环境
全局变量中有一个color和一个函数changeColor
changeColor中有一个anotherColor变量和swapColor函数
swapColor函数中有tmpColor,但是他可以访问以上所有的变量

2. c语言的执行顺序问题(变量的作用域)

程序总是从main函数开始执行的。

对于全局变量,声明的时候就对其赋值,也就是声明的时候,初始化它,是可以的。
因为声明的时候,就初始化,是在编译的时候,就处理了的。

程序要执行,必须经过编译和连接两个步骤,编译,会扫描整个文件,对每个宏,变量,语句,函数等等,都处理过,改展开的展开,改分配内存的分配内存。

如果某个变量,没用到,会在连接的时候知道,连接就是要看哪些用到了,哪些没用到,没用到的东西,最后不被连接进exe文件中。

int a=2,b=4; 这个语句,并不是给全局变量赋值的语句,而是声明的同时赋值的

你不能这样写:
int a,b;
a=2;//这才是赋值,如果放到所有函数的外面,是不行的。
int first_fun(){
b=4;//放在函数内部,是可以的
}

外部程序块的变量的作用域,也是向下兼容的。

因此,为例first_fun()中就不能用到C这个变量。就如:

int last_fun()
{
int a, b;

c= a;////////a,b,c都是局部变量,但c在下面才定义,所以,这里不能使用

int c;

}

3. 请问怎么样修改电脑 环境变量的前后顺序

java version 1.7.0_03 JavaTM SE Runtime Environment build 1.7.0_03-b05 Java HotSpotTM 64-Bit Server VM build 22.1-b02 mixed mode JAVA变量path classpth java_home设置 我在win7安装的版本是jdk-7u3-windows-x64 最新版本的下载地址是http://www.oracle.com/technetwork/java/javase/downloads/index.html 如果是压缩包解压那就得到exe文件点击安装即可中间过程需要选择接受一些要求以及配置一些工具一切全选就是按照默认不要动就行不过安装目录是你随便定的只要你能记得住。。。 默认安装在C:Program FilesJavajdk1.7.0_03目录下 然后鼠标右键单击计算机-〉属性-〉高级选项-〉系统设置——最右下角有一个“环境变量”。以后的操作就在下边的一个“系统变量”进行操作。 我们将要对环境变量配置为 PATH.JAVA_HOMEbin等同于C:Program FilesJavajdk1.7.0_03bin CLASSPATH.JAVA_HOMElibdt.jarJAVA_HOMElibtoos.jar JAVA_HOMEC:Program FilesJavajdk1.7.0_03 在新的打开界面中的系统变量需要设置三个属性“JAVA_HOME”、“CLASSPATH”、“Path”。 1.看一下你的机器里面是否已经有了JAVA_HOME这个系统变量正常情况下只要没有装过jdk是不会有的点“新建”然后在变量名写上JAVA_HOME然后在变量值写入刚才安装的路径“C:Program FilesJavajdk1.7.0_03”。点击确定保存。 2.其次在系统变量里面找到Path没有就新建然后点编辑path变量的含义就是系统在任何路径下都 可以识别java命令则变量值为“.JAVA_HOMEbin”也可以直接写上“C:Program FilesJavajdk1.7.0_03bin” 。点击确定保存。 3. 最后再点“新建”然后在变量名上写CLASSPATH该变量的含义是为java加载类class or lib路径只有类在CLASSPATH中java命令才能识别。其值为:“.JAVA_HOMElibdt.jarJAVA_HOMElibtoos.jar 要加.表示当前路径”。 以上三个变量设置完毕则按“确定”直至属性窗口消失下来是验证看看安装是否成功。先打开“开始 ”- “运行”打入“cmd”进入dos系统界面。然后打“java -version”如果安装成功。系统会显 示java version 1.7.0_03 安装成功了

4. 在LINUX中,环境变量的加载顺序

内核启动的时候,各个驱动初始化的工作在文件init/main.c中的do_basic_setup()函数中做.
------------------------------------------------------------------------------------------------------
static void __init do_basic_setup(void)
{
/* drivers will send hotplug events */
init_workqueues();
usermodehelper_init();
driver_init();

#ifdef CONFIG_SYSCTL
sysctl_init();
#endif

/* Networking initialization needs a process context */
sock_init();

do_initcalls();
}
------------------------------------------------------------------------------------------------------
其中的driver_init()做一些核心的初始化,看看代码就明白了.
相应的驱动程序的初始化在do_initcalls()中做.
------------------------------------------------------------------------------------------------------
static void __init do_initcalls(void)
{
initcall_t *call;
int count = preempt_count();

for (call = __initcall_start; call < __initcall_end; call++) {
char *msg;

if (initcall_debug) {
printk(KERN_DEBUG "Calling initcall 0x%p", *call);
print_fn_descriptor_symbol(": %s()", (unsigned long) *call);
printk("\n");
}

(*call)();

msg = NULL;
if (preempt_count() != count) {
msg = "preemption imbalance";
preempt_count() = count;
}
if (irqs_disabled()) {
msg = "disabled interrupts";
local_irq_enable();
}
if (msg) {
printk(KERN_WARNING "error in initcall at 0x%p: "
"returned with %s\n", *call, msg);
}
}

/* Make sure there is no pending stuff from the initcall sequence */
flush_scheled_work();
}
------------------------------------------------------------------------------------------------------
这个__initcall_start是在文件 arch/xxx/kernel/vmlinux.lds.S (其中的xxx 是你的体系结构的名称,例如i386)
这个文件是内核ld的时候使用的.其中定义了各个sectioin,看看就明白了。
在这个文件中有个.initcall.init, 代码如下:
------------------------------------------------------------------------------------------------------
__initcall_start = .;
.initcall.init : {
*(.initcall1.init)
*(.initcall2.init)
*(.initcall3.init)
*(.initcall4.init)
*(.initcall5.init)
*(.initcall6.init)
*(.initcall7.init)
}
------------------------------------------------------------------------------------------------------

这里有7个初始化的优先级,内核会按照这个优先级的顺序依次加载.
这些优先级是在文件include/linux/init.h 中定义的. 你注意一下宏 __define_initcall的实现就明白了.
相关代码如下:

#define __define_initcall(level,fn) \
static initcall_t __initcall_##fn __attribute_used__ \
__attribute__((__section__(".initcall" level ".init"))) = fn

#define core_initcall(fn) __define_initcall("1",fn)
#define postcore_initcall(fn) __define_initcall("2",fn)
#define arch_initcall(fn) __define_initcall("3",fn)
#define subsys_initcall(fn) __define_initcall("4",fn)
#define fs_initcall(fn) __define_initcall("5",fn)
#define device_initcall(fn) __define_initcall("6",fn)
#define late_initcall(fn) __define_initcall("7",fn)

我们可以看到,我们经常写的设备驱动程序中常用的mole_init其实就是对应了优先级6:
#define __initcall(fn) device_initcall(fn)

#define mole_init(x) __initcall(x);

文章出处:http://www.diybl.com/course/6_system/linux/Linuxjs/2008628/128990.html

5. javascript 中不同类型以及不同环境下变量的内存都是何时释放

一.基本类型和引用类型的值
javascript中的变量包含两种不同数据类型的:基本类型值和引用类型值。基本类型值指的是简单的数据段,而引用类型值指那些可能右多个值构成的对象。

1.动态的属性
定义基本类型值和引用类型值的方式是类似的:创建一个变量并为该变量赋值。但是,当这个值保存到变量中以后,对不同类型值可以执行的操作则大相径庭。
对于引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法:
var person = new Object();
person.name = "Nicholas";
alert(person.name);// “Nicholas”
基本类型值不能动态添加:
var name = "Nicholas";
name.age = 27;
alert(name.age);// undefined
2.复制变量值
复制变量值时两种类型也会有所不同。
基本类型:
重新在内存中开辟一段空间,赋值前后的两者相互独立
引用类型:
虽然也会重新开辟一段空间,但其接受到的值实际上是一个指针,而这个指针指向存储在堆中的一个对象。赋值操作结束后,两个变量实际上将引用同一个对象。
3.传递参数
javascript中所有函数的参数都是按值传递的。基本类型值的传递如同基本类型变量的复制一样,而引用类型的值的传递,则如同引用类型变量的复制一样。
在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部,情况下面例子:
function addTen(num){
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
alert(count);// 20,没有变化
alert(result);// 30
引用传递:
function setName(obj){
obj.name = "Nicholas";
}
var person = new Object();
setName(person);
alert(person.name);// "Nicholas"
证明对象是按值传递的例子:

function setName(obj){
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name);// "Nicholas"
4.检测类型
在检测基本类型时typeof是非常得力的助手,但在检测引用类型的值时,这个操作符的用处不大。通常,我们并不是想知道某个值是对象,而是想知道它是什么类型的对象。为此,javascript提供了instanceof操作符,其语法如下:
result = variable instanceof constructor
alert(person instanceof Object);// 变量person是Object吗?
alert(colors instanceof Array);// 变量colors是Array吗?
alert(pattern instanceof RegExp);// 变量parrern是RegExp吗
二.执行环境和作用域
执行环境是javascript中最为重要的一个概念。执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为。每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
每个函数都有自己的执行环境。当执行流进入一个函数时,函数的执行环境就会被推入一个环境栈中。而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境。Javascript中的执行流正式右这个方便的机制控制着。
当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,始终都是当前执行的代码所在环境的变量对象。如果这个环境是函数,则将其活动对象作为变量对象。活动对象最开始只包含一个变量,即arguments对象。作用域链中的下一个变量对象来自包含(外部)环境,直至全局执行环境的变量对象
1.延长作用域链
虽然执行环境的类型总共只有两种——全局和局部(函数),但是可以延长作用域链。因为有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象在执行代码后被移除:
try-catch语句的catch快
with语句
2.没有块级作用域
先看如下例子:
if (true){
var color = "blue";
}
alert(color);// "blue"
for (var i = 0; i < 10; ++i){
doSomething(i);
}
alert(i); // 10
使用var声明的变量会自动被添加到最接近的环境中。在函数内部,最接近的环境就是函数的局部环境;在with语句中,最接近的环境是函数环境。如果初始化变量时没有使用var声明,该变量会被添加到全局变量
3.垃圾收集
1.收集方式
标记清除、引用清除
2.性能问题(临界值)
3.管理内存(不用的数据即使设置为null)
四.总结
javascript变量可以用来保存两种类型的值:基本类型值和引用类型值。基本类型的值源自以下5种基本类型数据:Undefined、Null、Boolean、Number和String。基本类型值和引用类型值具有以下特点:
基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中
从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本
引用类型的值是对象,保存在堆内存中
包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针
从一个变量向另一个变量复制引用类型的值,赋值的其实是指针,因此两个变量最终都指向同一个对象
确定一个值是哪种基本类型可以使用typeof操作符,而确定一个值是哪种引用类型可以使用instanceof操作符

所有变量(包括基本类型和引用类型)都存在于一个执行环境(也称为作用域)当中,这个执行环境决定了变量的声明周期,以及哪一部分代码可以访问其中的变量。以下是关于执行环境的几点总结:
执行环境有全局执行环境(也成为全局环境)和函数执行环境之分
每次进入一个新执行环境,都会创建一个用于搜索变量和函数的作用域链
函数的局部环境不仅有权访问函数作用域中的变量,而且有权访问其包含(父)环境,乃至全局环境
全局环境只能访问在全景环境中定义的变量和函数,而不能直接访问局部环境中的任何数据
变量的执行环境有助于确定应该合适释放环境
javascript是一门具有自动垃圾收集机制的编程语言,开发人员不必关心内存分配和回收问题。可以对Javascript的垃圾收集例程作如下总结:
离开作用域的值将被自动标记为可以回收,因此将在垃圾收集期间被删除
“标记清除”是目前主流的垃圾收集算法,这种算法的思想是给当前不实用的值加上标记,然后再回收其内存
另一种垃圾收集算法是“引用计数“,这种算法的思想是跟踪记录所有值被引用的次数。Javascript引擎不浅不再使用这种算法;但在IE中访问非原声JavaScript对象(如DOM对象)时,这种算法仍然可能导致问题
当代码中存在循环引用现象时,“引用技术”算法就会导致问题
解除变量的引用不仅有助于消除循环引用现象,而且对垃圾收集也有好处。为了确保有效地回收内存,应该及时接触不再使用的全局对象、全局对象属性以及循环引用变量的引用

6. 环境变量PATH, CLASSPATH的作用,以及它们的设置方法

我们发现每次程序编译与运行都要输入D:\develop\Java\jdk1.7.0_72\bin后,才能使用javac.exe与java.exe,这样的方式很麻烦,那么,能否不输入D:\develop\Java\jdk1.7.0_72\bin呢?是可以的,通过配置Windows的PATH环境变量来完成。
PATH变量中保存着多个路径,当我们在DOS控制台中使用的程序只给出程序名称,而没有给出完整路径时,那么Windows系统会到PATH变量保存的路径中去查找程序。我们如果把“D:\develop\Java\jdk1.7.0_72\bin”路径保存到PATH变量中,那么在我们使用javac或java时,Windows系统就会自动到“D:\develop\Java\jdk1.7.0_72\bin”路径下查找javac和java了。
l
配置步骤:
鼠标右键点击计算机

属性

高级系统设置

点击环境变量

找到系统变量中的PATH

点击编辑按钮。
将JDK安装目录\bin路径(我的电脑上的D:\develop\Java\jdk1.7.0_72\bin)配置到PATH变量中,用英文分号与其他变量隔开。
注意:配置PATH后文件的访问顺序:先访问当前路径,如果当前路径没有该文件,则再访问PATH配置的路径。
除了直接配置path的方式外,针对Java还可以使用第二种JAVA_HOME的方式进行配置:
l
右键点击计算机

选择属性

更改设置

点击高级

点击环境变量

在系统环境变量中,创建名为JAVA_HOME的环境变量

将java所在的目录路径配置到JAVA_HOME变量中,用;与其他变量分隔

在path环境变量中添加%JAVA_HOME%\bin

7. 为什么要配置环境变量以及配置环境变量的步骤

1、计算机在执行命令的时候是在环境变量找对应的命令的位置的。如果不正确设置环境变量就不能正确使用相应的命令
2、比如说要执行
java
命令,如果不设置环境变量path包括你的jdk安装路径,那系统去哪找java.exe文件。
如果执行某个命令,系统无法在当前文件夹里找到对应的.exe,那么系统就会去path包含的路径找挨个找看是否能知道对应的.exe,一旦找到第一个对应的.exe就运行命令,其他的路径下就不找了。如果找不到就会报“系统找不到某某命令”的提示。
其他的环境变量也一样的用途,只不过是用来存储一些信息用的,这些信息可以被系统使用,也可以被应用程序使用
配置环境变量步骤:
方式一:此电脑--》属性--》左上侧的高级系统设置--》高级---》环境变量
方式二:点击系统左下角的搜索--》输入"环境"两个字--》"编辑系统环境变量"

8. 在windows系统命令行环境中如何访问变量值

用百分号将变量名括起来:
如:
cd %windir%