Javascript变量、范围和内存

JS的变量是一个松散的(自然型)的性质,确定那是一个用于在一个给定的时间保存在某一特定值的名称。

由于没有规则定义变量必须保存什么类型的数据类型值,所以变量和数据类型的值可以在脚本的生命周期中更改;

一变量和范围

1。基本类型和引用类型

js变量包含两种不同的数据类型:基本值类型和引用类型值值;

1。基本值类型:在内存中保存堆栈上的简单数据段;在内存中保存一个位置的值;

基本类型包括:未定义的|空|布尔|数|字符串/价值;

这些固定大小的类型占用内存空间;存储在堆栈空间中的值,我们根据访问的值;

2。引用类型值:将对象保存在堆内存中(可能由多个值,即存储的变量)实际上是指针,指向内存中另一个位置的指针,保存对象的位置;

值/引用类型的大小不是固定的,因此不能存储在堆栈中,内存必须存储在堆内存中,但它是存储在堆栈内存中的引用类型内存地址的值;

在引用类型的查询变量中,从堆栈内存中读取内存地址,然后通过引用值在堆内存访问中找到地址;

2。动态属性




类型的基本值类型和引用值的定义与方法类似:为变量赋值创建变量;
但是,当这个值保存到一个变量时,可以执行不同类型的操作的值是不一样的;
var =新的(对象);创建引用类型;
Box.name ='lee'; / / add an attribute;
console.log(盒。名称); / / = >李;

VaR箱= 'lee '; / /创建类型
box.age = 15; / /基本类型添加属性;
console.log(盒。年龄); / / = >定义;


三.复制的变量值




在变量复制中,基本类型和引用类型是不同的;
基本类型赋值是值本身;
VaR箱= 'lee '; / /在内存中创建一个box'lee叠;
VaR Box2 =箱; / /生成box2'lee'stack记忆;
/ /箱箱完全独立;两变量互不影响操作;

引用类型是地址分配;
var =新的(对象);创建参考类型;堆内存中的堆栈内存中的对象;对象;
box.name = 'lee '; / /添加属性;
VaR Box2 =箱; / /分配到箱箱内存堆栈上的地址;
/ /箱=箱,因为它们指向同一个对象;
/ /如果这个对象的名称属性被修改,该box.name和box2.name输出值将被修改;


4。传递参数




参数中的所有函数都是通过值传递的,参数不会被引用传递;
函数框(努姆){通过值传递,参数传递是基本类型;
10;这里是一个局部变量,全局无效;
返回num;
}
var = 50;
var =框(努姆);
console.log(结果); / / 60;
console.log(努姆); / / 50;

函数框(努姆){
返回num;
}
console.log(努姆); / /民没有定义;

功能盒(obj){
obj.name = 'lee;
var obj =新(对象); / /内部功能和创建一个对象,它是一个局部变量;但在函数结束时被销毁;
obj.name =; / /不更换目标;
}
新对象();
Box (P); / / P variable is passed to the box () function is then copied to obj; inside the function, obj and P to access the same object;
console.log(器); / / = >李;

函数的参数是局部变量,也就是说,不能通过引用传递;


5。检测类型




/ /类型变量的检测通过typeof运算符,判断;
对于基本类型的检测;
VaR箱= 'lee;
console.log(typeof箱); / / = >字符串;

检测 / /变量是什么类型的对象,通过看实例操作;
VaR箱= {1,2,3};
console.log(盒是数组); / / = >真的;
VaR Box2 = { };
console.log(Box2实例对象);
var = /克/盒;
控制台。L(盒instanceof表达式);
VaR BOX4 =新的字符串('lee);
console.log(BOX4是字符串); / / = >真;无论字符串对象;

VaR箱= 'String';
console.log(箱是字符串); / / = >假;
当使用instanceof检查价值 / /基本类型,则返回false;


6。环境和范围的实施




执行环境:定义其他变量或函数是否可以访问数据,确定它们各自的行为;
在Web浏览器中,全局执行环境=窗口;
因此,全局变量和函数都是作为窗口对象的属性和方法创建的;
VaR箱= '蓝色'; / /声明一个全局变量;
功能的机顶盒中(){
console.log(箱); / /全局变量可以在函数;
}
(机顶盒中); / /执行功能;
全局变量=窗口/属性对象;
全局窗口对象的函数方法;

当执行完成后,环境中的所有代码执行时,环境被销毁,保存在所有定义的变量和函数中也被销毁;
如果它在全局环境中,需要执行,或者关闭页将被销毁;

中:每个执行环境都有一个相关的变量对象,比如全局窗口可以调用全局变量和全局方法;
本地环境也有类似的窗口环境变量对象,所有变量和函数定义都存储在对象中;
(我们不能访问变量对象,但是解析器将在后台处理数据);
VaR箱= '蓝色';
功能的机顶盒中(){
VaR箱='; / /这是价值is'red在当前函数的局部变量;身体的功能是不知道的;
console.log(箱);
}
机顶盒中的();
console.log(箱);

本地变量参数可以替换函数体,但只能在本地环境中此函数的作用域中;
VaR箱= '蓝色';
功能的机顶盒中(盒){ / /传递参数,局部变量与全局变量替换;
警报(框);这是外部调用的框参数值;
}
机顶盒中的(');
警报(方框);

如果一个函数体也包含这个函数,函数只在函数中可以访问外部变量;
内部环境可以通过范围链访问所有外部环境,但是外部环境不能访问内部环境中的任何变量和函数;
VaR箱= '蓝色';
功能的机顶盒中(){
功能设置颜色(){
var b = 'orange;
警报(方框);
警报(B);
}
(设置颜色)(设置颜色); / /执行环境在机顶盒中(中);
}
机顶盒中的();
每个函数被调用来创建自己的执行环境;当执行这个函数时,环境的功能将被推到环境中的堆栈中执行,而且在栈弹出(退出)的实现中的环境中,将控制交给更高的执行环境;

当代码在一个环境中执行时,它将形成一个称为作用域的事物链,其目的是确保执行环境的访问变量和函数以访问;范围链的前面,是环境变量对象的实现;


7。延长作用链




某些语句前面的范围链临时增加了一个变量对象,对象将在代码执行后被删除;
带/并尝试catch语句;这两个语句将在范围链前面添加一个变量对象;
带语句:将指定的对象添加到范围链中;
catch语句:创建一个新的变量对象,该对象包含正在抛出到错误语句中的对象;
功能buildurl(){
VaR QS = 'debug = true;
位置对象接收带有位置的语句,因此变量对象包含位置对象的所有属性和方法;
var url =链接+ QS; / /这个变量对象添加到作用域链的前端;
};
返回的URL;
}


8。无阻塞级范围




块级别范围:如if语句有括号关闭的代码块,因此支持条件判断来定义变量;
如果(true){语句语句块没有本地范围;
VaR箱= 'lee '; / /变量声明将被添加到当前执行环境变量(这里是全球环境);
}
警报(方框);

对于(var i = 0;i < 10;+ +);创建变量i,即使在执行后的for循环中,它仍然将存在,并且外部执行环境的循环;
VaR箱= 'lee;
}
警报(一);
警报(方框);

功能盒(num1,num2){
VaR和= num1 + num2; / /和此时是一个局部变量;如果你把无功,和是一个全局变量;
收起回复;
}
警报(箱(10,10));
警报(总和);未定义总和访问总数;
建议不要使用var初始化变量,因为这种方法可能导致各种意外;

一般确定的变量是通过搜索实际代表的标识符来确定的:搜索查询;一步一步地;
VaR箱= '蓝色';
功能getbox(){
返回 / /盒盒;此时是一个全局变量;如果VaR盒子=',它就变成了一个局部变量;
}
警报(getbox());
电话getbox() / /指变速箱;
(getbox) / /首先,搜索变量对象的查找标识符称为箱;
然后继续搜索下一个对象变量(全局环境变量、查找对象)框标识符;
在查询中,变量比全局变量更快地访问本地变量,因为它不需要搜索范围链;


两个内存问题




使用自动垃圾收集机制,使用执行环境负责管理内存的代码执行过程;它将恢复管理内存分配和无用内存;

js是最常用的垃圾收集,是删除标记;垃圾收集器将在运行时标记以存储在变量的内存中;
然后,它将被用来删除环境变量,并且没有被删除,标记变量将被视为已经准备好移除变量;
最后,垃圾回收器完成了内存清除工作,销毁了标记的值和恢复所占用的内存空间;

是周期性操作的垃圾收集器,它会导致整个过程的性能问题;
例如 / /以前版本的IE7,他的垃圾收集器是根据内存分配量运行,如256个变量开始运行垃圾回收器,具有频繁操作,从而降低性能;

一般来说,为了确保性能占用最少的内存,可以使页面变得更好;
/ /最佳方案:一旦数据不再使用,将其值设置为null来释放引用,这种方法被称为引用;
var { { { {
名称:'lee;
};
O = NULL;删除对象引用,等待垃圾回收器的恢复;


三总结



1。变量

js变量可以分为两种类型:基本值、存储值类型和引用类型;它们具有以下特性:

1。内存中的固定值占用空间的基本类型,因此它存储在堆栈内存中;

2。从一个变量到另一个变量,复制基本类型的值,将创建一个值的副本;

三.引用类型的值存储在堆内存对象中;

4。包含类型变量的引用值,实际包含的不是对象本身,而是对象的指针;

5。从一个变量到另一个变量来复制引用类型的值,复制实际上是一个指针,所以这两个变量最终指向一个对象;

6。 /确定价值的typeof运算符的基本类型可以使用;并确定哪些类型的引用可以使用instanceof操作符是一个值;

2。范围

所有变量都存在于一个执行环境(范围)中,执行环境决定了变量的生命周期和代码可以访问的变量;

1。执行环境总体执行环境和功能的执行环境;

2。每次进入一个新的执行环境时,将创建一个搜索范围链的变量和函数;

三.本地环境功能不仅有权访问变量的功能域,而且有权访问他的父亲,甚至是全球环境;

4。变量执行环境有助于确定权限应该释放内存;

三.记忆

自动垃圾收集机制

1。超出范围值将自动标记为可以循环使用,因此在垃圾收集期间将被删除;

2。为了确保内存的有效恢复,应删除全局对象不再使用全局对象属性和引用周期引用变量;